一、使用transient關鍵字修飾Filed雖然簡單方便,可是被transient修飾的Filed徹底被隔離在序列化機制以外,這樣致使在反序列化恢復時沒法取該Filed的值。
java
Java提供了一種自定義序列化機制,經過這種自定義機制可讓程序控制如何序列化各Filed.
程序員
在序列化和反序列化過程當中須要特出處理的類應該提供以下特殊方法:
性能
private void writeObject(java.io.ObjectOutputStream out) throws IOException; private void readObject(java.io.ObjectIntputStream out) throws IOException,ClassNotFoundException; private void readObjectNoData()throws ObjectStreamException;
二、還有一種更完全的自定義機制,他甚至能夠在序列化對象時將該對象替換成其餘對象,重寫writeReplace()方法。spa
這是由於在系統在序列化某個對象以前,會先調用該對象的writeReplace()和writeObject()方法,系統老是先調用被序列化的對象的writeReplace()方法,若是該對象方法返回另外一個對象,系統將再次調用另外一個對象的writeReplace()方法.......,直到該方法再也不返回另外一個對象爲止,程序最後將調用該對象的writeObject()方法來保存該對象的狀態。接下來調用readObject()方法,該方法的返回值會代替原來反序列化的對象,原來的readObject()反序列化的對象會被丟棄。code
三、另外一種自定義序列化機制
對象
這種序列化機制徹底由程序員決定存儲和恢復對象數據,可是強制必須實現Externalizable接口,實現readExternal(ObjectInput in)和writeExternal(ObjectOutput out)。接口
這種實現機制雖然麻煩,可是相比實現Serializable接口性能略好。
it