java 對象序列化

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類型,而是另一個引用類型,則這個引用類必須是可序列化的,否則擁有該類型屬性的類是不可序列化的。

發佈了28 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章