《Java面向對象編程》學習筆記17--對象的序列化和反序列化

 原文出處:http://blog.csdn.net/gnuhpc/archive/2009/10/24/4722525.aspx

 

將原文的代碼加了main函數

 

1.定義:

序列化--將對象寫到一個輸出流中。反序列化則是從一個輸入流中讀取一個對象。類中的成員必須是可序列化的,而且要實現Serializable接口,這樣的類的對象才能被序列化和反序列化。這個接口是一個表示型的接口。serialVersionUID 是一個串行化類的通用標示符,反串行化就是使用這個標示符確保一個加載的類對應一個可串行化的對象。

自己指定了serialVersionUID,就可以在序列化後,去添加一個字段,或者方法,而不會影響到後期的還原,還原後的對象照樣可以使用, 而且還多了方法可以用。serialVersionUID的生成,可以寫1,也可以寫2,但最好還是按照摘要算法,生成一個惟一的指紋數 字,eclipse可以自動生成的,jdk也自帶了這個工具。一般寫法類似於
private static final long serialVersionUID = -763618247875550322L;

2.序列化步驟:

1)創建一個對象輸出流:可以包裝一個其他類型的輸出流。

2)通過對象輸出流的writeObject()寫對象。注意使用類型轉化,轉換爲相應的類的對象。

3.反序列化步驟:

1)創建一個對象輸入流:可以包裝一個其他類型的輸出流。

2)通過對象輸出流的readObject()寫對象。

4.什麼對象需要被序列化?

序列化的基本想法是完成對實例信息的保證。因爲實例信息在運行結束後就消失了。要儲存什麼信息呢?一定不是關於方法的信息。

5.使用注意事項:

a.有些屬性處於安全考慮不能被序列化(或者不能被序列化),則用transit修飾,若想進一步控制序列化和反序列化,則類中提供 readObject()方法和writeObject()方法,(反)序列化時就會調用自定義的方法。注意這兩個方法不是在 java.io.Serializable接口定義的,而是在ObjectInputStream和ObjectOutputStream類中定義的,這 兩個類實現ObjectInput 和ObjectOutput兩個接口。下邊是一個可變數組的例子,取自Java in a Nutshell 2rd Edition,它在串行化實現了高效的針對可變數組程度調整的方法:

 

注意:代碼中我們自己定義的writeObject()和readObject()是由JVM爲我們調用的.

 

b.由於序列化是針對類的實例,也就是對象的,所以static這樣的成員是類相關的,也就不會被序列化。
c.注意,API中一個類一旦被序列化了,那麼它的父類都是序列化的。你自己設計的類要是想被序列化,那麼其父類要確保都序列化。父類一旦序列化,則子類們都自動實現了序列化。所以內部類和可擴展類不建議序列化。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章