天天看點

對象的序列化和反序列化

  序列化實際上是序列對象的屬性,而不是方法。需要序列化的對象對應的類必須實作Serializabel接口

1. 序列化操作:

  File f = new File("D:" + File.separator + "test.txt") ; // 定義儲存路徑

ObjectOutputStream oos = null ; // 聲明對象輸出流

OutputStream out = new FileOutputStream(f) ; // 檔案輸出流

oos = new ObjectOutputStream(out) ;

oos.writeObject(new Person("Name",10)) ; // 儲存對象

oos.close() ; // 關閉

2. 反序列化操作

ObjectInputStream ois = null ; // 聲明對象輸入流

InputStream input = new FileInputStream(f) ; // 檔案輸入流

ois = new ObjectInputStream(input) ; // 執行個體化對象輸入流

Object obj = ois.readObject() ; // 讀取對象

ois.close() ; // 關閉

System.out.println(obj) ;

反序列化:SubscriptionCacheObjectSerializingHandler->deserialize(byte[] in)

3. 

public static void ser() throws Exception {

File f = new File("D:" + File.separator + "test.txt") ; // 定義儲存路徑

oos.writeObject(new Person("張三",30)) ; // 儲存對象

}

public static void dser() throws Exception {

4. 說到此,還有一個容易忽略的問題--serialVersionUID :

如果可序列化類未顯式聲明 serialVersionUID,則序列化運作時将基于該類的各個方面計算該類的預設 serialVersionUID 值,如“Java(TM) 對象序列化規範”中所述。不過,強烈建議 所有可序列化類都顯式聲明 serialVersionUID 值,原因計算預設的 serialVersionUID 對類的詳細資訊具有較高的敏感性,根據編譯器實作的不同可能千差萬别,這樣在反序列化過程中可能會導緻意外的 <code>InvalidClassException</code>。是以,為保證 serialVersionUID 值跨不同 java 編譯器實作的一緻性,序列化類必須聲明一個明确的 serialVersionUID 值。還強烈建議使用 <code>private</code> 修改器顯示聲明 serialVersionUID(如果可能),原因是這種聲明僅應用于立即聲明類 -- serialVersionUID 字段作為繼承成員沒有用處。

serialVersionUID 在Eclipse裡可以自動生成,可是在其他大部分IDE工具裡面都不能自動生成。但是這個long型值取多少,心裡沒底,與其寫還不如不寫。

本文轉自 tianya23 51CTO部落格,原文連結:http://blog.51cto.com/tianya23/244684,如需轉載請自行聯系原作者

繼續閱讀