2010-03-26 35 views
3

爲什麼table字段的Hashtable序列化,儘管它被標記爲transient爲什麼Hashtable的表屬性被序列化?

+1

代碼示例和可能的Java版本將有助於回答您的問題。 – msw 2010-03-26 14:56:36

+2

@msw - 不是。任何有Java經驗的人都知道在哪裏可以找到Hashtable的源代碼。 – 2010-03-26 15:06:50

回答

7

它被標記爲transient,因爲在Entry陣列上使用默認序列化方案是不安全的。相反,當一個Hashtable被反序列化時,表中的鍵必須重新映射,並且必須根據新的哈希碼值將這些條目添加到槽中。這是必要的,因爲密鑰在反序列化之後可能具有不同的哈希碼......出於各種原因。這項工作將由Hashtable的readObject()方法完成。

+0

更一般地說,它會削減實現和序列化格式之間的依賴關係,以便在後者保持兼容的同時前者可以更改。你可以看到序列化沒有想到的醜陋黑客。 – 2010-03-26 15:17:12

1

因爲它具有writeObject()readObject()實現(私有方法),它可以控制它如何被序列化和反序列化。它在Java 1.6源代碼中位於800行左右。

查看此Sun advanced serialization guide瞭解詳細信息它是如何工作的「內部」。

+0

非常感謝。你能否告訴我爲什麼它被宣佈爲暫時的。 – ppoliani 2010-03-26 15:06:58

+1

這樣它就不會「自動」進行序列化,這會導致數據重複。 – BalusC 2010-03-26 15:07:39

+0

它確定我被覆蓋,再次感謝! – ppoliani 2010-03-26 15:08:35

1

如果你看一下Hashtable類(至少在1.6)的源代碼,Entry[] table被標記爲transient但類實現writeObject(),其中的條目表的內容寫入ObjectOutputStream

因此,哈希表的內容總是被序列化。

他們爲什麼選擇這樣實施?有可能控制數組如何序列化。

相關問題