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