序列化實際上是序列對象的屬性,而不是方法。需要序列化的對象對應的類必須實作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,如需轉載請自行聯系原作者