Serializable接口初探
類通過實現(xiàn) java.io.Serializable 接口以啟用其序列化功能。未實現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。可序列化類的所有子類型本身都是可序列化的。序列化接口沒有方法或字段,僅用于標(biāo)識可序列化的語義。
Java的"對象序列化"能讓你將一個實現(xiàn)了Serializable接口的對象轉(zhuǎn)換成一組byte,這樣日后要用這個對象時候,你就能把這些byte數(shù)據(jù)恢復(fù)出來,并據(jù)此重新構(gòu)建那個對象了。
要想序列化對象,你必須先創(chuàng)建一個OutputStream,然后把它嵌進(jìn)ObjectOutputStream。這時,你就能用writeObject( )方法把對象寫入OutputStream了。
writeObject 方法負(fù)責(zé)寫入特定類的對象的狀態(tài),以便相應(yīng)的 readObject 方法可以還原它。通過調(diào)用 out.defaultWriteObject 可以調(diào)用保存 Object 的字段的默認(rèn)機制。該方法本身不需要涉及屬于其超類或子類的狀態(tài)。狀態(tài)是通過使用 writeObject 方法或使用 DataOutput 支持的用于基本數(shù)據(jù)類型的方法將各個字段寫入 ObjectOutputStream 來保存的。
讀的時候,你得把InputStream嵌到ObjectInputStream里面,然后再調(diào)用readObject( )方法。不過這樣讀出來的,只是一個Object的reference,因此在用之前,還得先下傳。readObject 方法負(fù)責(zé)從流中讀取并還原類字段。它可以調(diào)用 in.defaultReadObject 來調(diào)用默認(rèn)機制,以還原對象的非靜態(tài)和非瞬態(tài)字段。
最后結(jié)果如下: node 0
node 1
node 2
node 3
node 4
node5
node 6




































































可以看到,在序列化的時候,writeObject與readObject之間的先后順序。readObject將最先write的object read出來。用數(shù)據(jù)結(jié)構(gòu)的術(shù)語來講就姑且稱之為先進(jìn)先出吧!
在序列化時,有幾點要注意的:
1:當(dāng)一個對象被序列化時,只保存對象的非靜態(tài)成員變量,不能保存任何的成員方法和靜態(tài)的成員變量。
2:如果一個對象的成員變量是一個對象,那么這個對象的數(shù)據(jù)成員也會被保存。
3:如果一個可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操作將會失敗,并且會拋出一個NotSerializableException。我們可以將這個引用標(biāo)記為transient,那么對象仍然可以序列化
還有我們對某個對象進(jìn)行序列化時候,往往對整個對象全部序列化了,比如說類里有些數(shù)據(jù)比較敏感,不希望序列化,一個方法可以用transient來標(biāo)識,另一個方法我們可以在類里重寫




示例:


























































posted on 2007-12-12 08:39 々上善若水々 閱讀(1116) 評論(0) 編輯 收藏 所屬分類: J2SE