Java中可序列化的类必须要实现Serializable接口或Externalizable接口,那么实现这两个接口的区别是什么呢。
若实现Serializable接口,若不做任何额外处理,类会有固定的序列化方式。即对所有的属性(除了transient和static关键字修饰的类型)进行序列化。若属性是基本类型,那当然很容易序列化,但属性若是对象的引用,那也会对引用的对象进行序列化,并且以此类推。若要实现自己独特的序列化/反序列化方式,就要覆盖writeObject和readObject方法了。如下:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeInt(age);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
age = in.readInt();
}
没错,可以调用ObjectOutputStream.defaultWriteObject()调用默认的序列化方式,然后就可以实现自己独特的序列化方式了;同样,可以调用ObjectIntputStream.defaultReadObject()调用默认的反序列化方式,同时也可以根据需要实现自己的反序列化方式。
若实现了Externalizable接口,类将不会有默认的序列化方法。这时候要实现类的序列化功能就要实现writeExternal和readExternal方法。如下:
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
out.writeInt(age);
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String) in.readObject();
age = in.readInt();
}
这样就实现了name和age属性的序列化和反序列化过程。