【发布时间】:2011-02-01 05:18:42
【问题描述】:
为什么Hashtable的table字段被序列化了,虽然标记为transient?
【问题讨论】:
-
代码示例和可能的 Java 版本将有助于回答您的问题。
-
@msw - 不是真的。任何有 Java 经验的人都知道在哪里可以找到 Hashtable 的源代码。
为什么Hashtable的table字段被序列化了,虽然标记为transient?
【问题讨论】:
它被标记为瞬态,因为在 Entry 数组上使用默认的序列化方案是不安全的。相反,当 Hashtable 被反序列化时,必须重新散列表中的键,并且必须根据新的 hashcode 值将条目添加到槽中。这是必要的,因为在反序列化后密钥可能具有不同的哈希码......出于各种原因。这项工作将由Hashtable的readObject()方法完成。
【讨论】:
因为它实现了writeObject() 和readObject()(在私有方法中),它可以控制如何序列化和反序列化。它在 Java 1.6 源代码的第 800 行左右。
查看此Sun advanced serialization guide 了解其“幕后”工作原理的详细信息。
【讨论】:
如果你查看 Hashtable 类的源代码(至少在 1.6 中),Entry[] table 被标记为transient,但该类实现了writeObject(),其中它将条目表的内容写入到ObjectOutputStream。
因此,Hashtable 的内容总是被序列化的。
他们为什么选择以这种方式实施它?可能控制数组的序列化方式。
【讨论】: