【问题标题】:Why is the table attribute of Hashtable serialized?为什么Hashtable的table属性是序列化的?
【发布时间】:2011-02-01 05:18:42
【问题描述】:

为什么Hashtabletable字段被序列化了,虽然标记为transient

【问题讨论】:

  • 代码示例和可能的 Java 版本将有助于回答您的问题。
  • @msw - 不是真的。任何有 Java 经验的人都知道在哪里可以找到 Hashtable 的源代码。

标签: java hashtable transient


【解决方案1】:

它被标记为瞬态,因为在 Entry 数组上使用默认的序列化方案是不安全的。相反,当 Hashtable 被反序列化时,必须重新散列表中的键,并且必须根据新的 hashcode 值将条目添加到槽中。这是必要的,因为在反序列化后密钥可能具有不同的哈希码......出于各种原因。这项工作将由Hashtable的readObject()方法完成。

【讨论】:

  • 更一般地说,它减少了实现和序列化格式之间的依赖关系,因此前者可以改变而后者保持兼容。您可以看到没有考虑序列化的丑陋黑客。
【解决方案2】:

因为它实现了writeObject()readObject()(在私有方法中),它可以控制如何序列化和反序列化。它在 Java 1.6 源代码的第 800 行左右。

查看此Sun advanced serialization guide 了解其“幕后”工作原理的详细信息。

【讨论】:

  • 非常感谢。你能告诉我为什么它被宣布为瞬态的吗?
  • 这样它就不会“自动”被序列化,这会导致数据重复。
【解决方案3】:

如果你查看 Hashtable 类的源代码(至少在 1.6 中),Entry[] table 被标记为transient,但该类实现了writeObject(),其中它将条目表的内容写入到ObjectOutputStream

因此,Hashtable 的内容总是被序列化的。

他们为什么选择以这种方式实施它?可能控制数组的序列化方式。

【讨论】:

    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2013-06-23
    • 1970-01-01
    • 2015-09-10
    • 2012-09-21
    • 2011-02-28
    相关资源
    最近更新 更多