大家都知道序列化物件中的hashmap、hashset或hashtable集合不能包含物件自身的引用。
經典例子:
class super implements serializable
final class sub extends super
public void checkinvariant()
public int hashcode()
public boolean equals(object o)
}首先,序列化系統會反序列化sub例項中super的域。唯一的這樣的域就是set,它包含了乙個對hashset的引用。在內部,每個hashset例項包含乙個對hashmap的引用,hashmap的鍵是該雜湊集合的元素。hashset類有乙個readobject方法,它建立乙個空的hashmap,並且使用hashmap的put方法,針對集合中的每個元素在hashmap中插入乙個鍵-值對。put方法會呼叫鍵的hashcode方法以確定它所在的單元格(bucket)。在我們的程式中,雜湊對映表中唯一的鍵就是sub的例項,而它的set域正在被反序列化。這個例項的子類域(subclass field),即id,尚未被初始化,所以它的值為0,即所有int域的預設初始值。不幸的是,sub的hashcode方法將返回這個值,而不是最後儲存在這個域中的值666。因為hashcode返回了錯誤的值,相應的鍵-值對條目將會放入錯誤的單元格中。當id域被初始化為666時,一切都太遲了。當sub例項在hashmap中的時候,改變這個域的值就會破壞這個域,進而破壞hashset,破壞sub例項。程式檢測到了這個情況,就報告出了相應的錯誤。
簡單的來講,在反序列化的時候,需要先處理set,而set需要sub物件,sub物件呢,還在等set初始完成,,id值不正確,set確定物件就是靠id值,所以會出現錯誤,感覺和死鎖很相似,2個互相等待,set需要sub的id,sub需要set完成才能獲取id。
序列化(序列化)
原書上翻譯為序列化,msdn翻譯為序列化 作用 當需要儲存,或者網路傳輸 remoting時,資料 物件或值 需要序列化 類似於打包傳輸檔案。system.serializableattribute 序列化是指儲存和獲取磁碟檔案 記憶體或其他地方中的物件。在序列化時,所有的例項資料都儲存到儲存介質上...
深入理解序列化和反序列化
序列化 就是將記憶體中的物件轉換為位元組序列,方便持久化到磁碟或者網路傳輸。物件序列化過程可以分為兩步 第一 將物件轉換為位元組陣列 第二 將位元組陣列儲存到磁碟 public static byte getbytearray4object object obj throws exception p...
序列化與反序列化 深入理解
序列化指的是將乙個記憶體物件轉化成一串位元組資料 儲存在乙個位元組陣列中 可用於儲存到本地檔案或網路傳輸。反序列化就是將位元組資料還原成記憶體物件。如 struct student 將乙個student物件轉換成位元組資料儲存在bytearray 20 中稱為序列化 如 int count 0 ch...