Java物件流與序列化

hipilee發表於2017-11-08

Java的序列化機制是RMI、EJB等技術的技術基礎。      

所有的類必須通過實現Serializable介面來實現序列化的功能,Serializable介面沒有任何方法,因此你不需要對這些類做任何改動。


----為什麼叫序列化

       readObject()函式從ObjectInputStream中讀入一個物件。特別是,這個方法會讀回物件的類,類的簽名以及這個類及其超類中所有非靜態和非瞬時的域的值,它執行的反序列允許恢復多個物件引用。--這說明了transient [ˈtrænziənt] 的變數不能被序列化。static的變數也不能序列化。


----修改預設的序列化機制

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException

private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException

看下ArrayList是如何實現的序列化和反序列化的:




       上述兩個方法只需要儲存和載入它們的資料域,而不需要關心超類資料和任何其他類的資訊。除了讓序列化機制來儲存和恢復物件資料,類還可以定義自己的機制。為了做到這一點,這個類必須實現Externalizable介面,這需要她定義兩個方法:

public void writeExternal(java.io.ObjectOutputStream s) throws java.io.IOException

public void readExternal(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException

       與上述的的方法不同的是,這了兩個方法要負責對包括超類資料在內的整個物件的儲存和恢復負全責,而序列化機制在類中僅僅只是記錄該物件所屬於的類。在讀入可外部化的類時,物件流將用無參構造器建立一個物件,然後呼叫readExternal方法。


----序列化單例

       為了解決這個問題,你需要定義另外一個被稱為readResolve的特殊序列化方法。如果定義了readResolve方法,在物件被序列化之後就會呼叫它。它必須返回一個物件,而該物件之後會成為readObject的返回值。

相關文章