序列化:Serializable和Externalizable
Externalizable是深度定制序列化。如果同时实现了这两个接口,则只会执行Externalizable。
Serializable可以仅仅标记可序列化,使用JDK默认的序列化方法,也可以定制。实现方法:
private void writeObject(ObjectOutputStream oos) { // oos.defaultWriteObject(); // Write/save additional fields oos.writeUTF(value); } private void readObject(ObjectInputStream ois) { // ois.defaultReadObject(); // Read/initialize additional fields value = ois.readUTF() }
Externalizable必须实现方法:
void writeExternal(ObjectOutput out) { out.writeUTF(value) } void readExternal(ObjectInput input) { value = input.readUTF() }
如果实现是深度定制序列化,但是用Serializable的writeObject方法实现,它不一定起作用。
注意几点:
1、静态static成员不被序列化
2、如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException
3、transient修饰的字段不被序列化
4、父类如果不可序列化,子类不会序列化父类的成员,除非在子类中显式序列化。父类可序列化,子类也需要调用super的序列化方法。