Serializable
Serializable
實現 java.io.Serializable 介面的類是可序列化的。沒有實現此介面的類將不能使它們的任一狀態被序列化或逆序列化。序列化類的所有子類本身都是可序列化的。這個序列化介面沒有任何方法和域,僅用於標識序列化的語意。
目錄
介面 java.io.Serializable
public interface Serializable
通俗點說,所謂的Serializable,就是java提供的通用數據保存和讀取的介面。至於從什麼地方讀出來和保存到哪裡去都被隱藏在函數參數的背後了。這樣子,任何類型只要實現了Serializable介面,就可以被保存到文件中,或者作為數據流通過網路發送到別的地方。也可以用管道來傳輸到系統的其他程序中。這樣子極大的簡化了類的設計。只要設計一個保存一個讀取功能就能解決上面說得所有問題。
允許非序列化類的子類型序列化,子類型可以假定負責保存和恢復父類型的公有的、保護的和(如果可訪問)包的域的狀態。只要該類(擴展)有一個無參構造子,可初始化它的狀態,那麼子類型就可承擔上述職責。在這種情況下申明一個可序列化的類是一個錯誤。此錯誤將在運行時被檢測。
在逆序列化期間,將使用非序列化類的公用的或保護的無參構造子對它的域進行初始化。可序列化子類必須能訪問父類的無參構造子。它的所有域將從相應流中被恢復。
當遍歷一個圖象時,很可能遇到一個不支持序列化介面的對象。此時將拋出 NotSerializableException 異常,且標識該非序列化對象類。
在序列化處理過程中需要特定句柄的類,必須使用如下這些恰當的標記實現特定的方法:
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
writeObject 方法負責寫特定類的對象的狀態,以至相應的 readObject 方法能恢復它。通過調用 out.defaultWriteObject 可激活保存對象域的預設機制。此方法不必關心狀態是屬於它的父類還是子類。使用 writeObject 方法或基本類型支持的 DataOutput 方法將每個域的狀態保存到 ObjectOutputStream 中。
readObject 方法負責從此流中讀取並恢復類的域。它可能調用 in.defaultReadObject 方法來調用該對象的非靜態和非暫時的域的預設恢復機制。 defaultReadObject 方法使用該流中的信息,用當前對象中的已命名域分配保存在流中該對象的相應域。當類已改進增加了新域時,這個介面也做相應處理。