通过对Serializable和Externalizable的简单比较,哪怕是极其简单的类,发现序列化结果的大小相差很大,可以从80压到50,大家可以试一下,原因应该是前者是完全序列化,包含了class信息。
这就告诉我们,如果分布式环境下,传递java对象不要怕麻烦,自己实现一下Externalizable接口会快很多。
public class A implements Serializable{
public int id = 1;
public String name = "aaa";
/**
* @param args
*/
public static void main(String[] args) {
A o = new A();
FileOutputStream fos;
try {
fos = new FileOutputStream("/work/test/objects");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(o);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileInputStream fis;
try {
fis = new FileInputStream("/work/test/objects");
ObjectInputStream ois = new ObjectInputStream(fis);
A oo = (A)ois.readObject();
System.out.println(oo.id);
System.out.println(oo.name);
// System.out.println(ois.readInt());
// System.out.println(ois.readObject());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* same content, using external style will from 80 bytes to 50 bytes
*
*/
public class B implements Externalizable{
public int id = 1;
public String name = "aaa";
/**
* @param args
*/
public static void main(String[] args) {
B o = new B();
FileOutputStream fos;
try {
fos = new FileOutputStream("f:/personal/test/objects2");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(o);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileInputStream fis;
try {
fis = new FileInputStream("/work/test/objects2");
ObjectInputStream ois = new ObjectInputStream(fis);
B oo = (B)ois.readObject();
System.out.println(oo.id);
System.out.println(oo.name);
// System.out.println(ois.readInt());
// System.out.println(ois.readObject());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(id);
out.writeObject(name);
}
@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
in.readInt();
in.readObject();
}
}