java學習筆記 對象序列化
目標:
將對象保存到磁盤中,或允許在網絡中直接傳輸對象,對象序列化機制允許把內存中的java對象轉換成與平臺無關的二進制流,從而允許把這種二進制流持久保存在磁盤上,或通過網絡將這種二進制流傳輸到另一個網絡節點。
含義:
對象的序列化(Serialize)指將一個java對象寫入IO流中,與此對應的是,對象的反序列化(Deserialize)則指的是從IO流中恢復該java對象。
方法:
爲了讓某個類是可序列化的,該類必須實現如下兩個接口之一:
Serializable
Externalizable
Java的很多類已經實現了Serializable,該接口是一個標記接口,實現該接口無須實現任何方法,它只是表明該類的實例是可序列化的。
所有可能在網絡上傳輸的對象的類都應該是可序列化的,否則程序會出現異常。比如RMI(Remote Method Invoke 遠程方法調用,Java EE的基礎)過程中的參數和返回值;所有需要保存到磁盤裏的對象都必須可序列化。
因爲序列化時RMI過程的參數和返回值都必須實現的機制,而RMI又是javaEE技術的基礎:所有分佈式應用常常需要跨平臺、跨網絡,因此要求所有傳遞的參數、返回值必須實現序列化,因此序列化機制是javaEE平臺的基礎。通常建議:程序創建的每個JavaBean類都實現Serializable。
需要注意的地方:
1. 反序列化機制無須通過構造器來初始化java對象。
2. 如果我們向文件中使用序列化機制寫入了多個java對象,使用反序列化機制恢復對象時必須按照實際寫入的順序讀取。
3. 如果一個可序列化類有多個父類(直接或間接父類),則該類的所有父類要麼是可序列化的,要麼有無參的構造函數---否則反序列化時會拋出InvalidClassException異常。當程序創建子類實例時,系統會隱式地爲它的所有父類都創建實例(並建立和此子類的關聯)。當我們反序列化某個子類的實例時,反序列化機制需要恢復其關聯的父類實例。
恢復這些父類實例有兩種方法:
(1) 使用反序列化機制
(2) 使用父類無參構造函數
以上兩種方式,反序列化機制優先選擇第一種機制。如果某個父類既不可序列化(不能使用第一種方法),又沒有提供無參的構造函數(不能用第二種方法),則反序列化該子類實例時會拋出異常。、
4. 如果某個類的屬性類型不是基本類型或String類型,而是另一個引用類型,則這個引用類必須是可序列化的,否則擁有該類型屬性的類是不可序列化的。