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的序列化方法。