【问题标题】:how does serializable work in java?可序列化在java中是如何工作的?
【发布时间】:2011-01-09 20:45:57
【问题描述】:

如果我有一个存储在会话中的类的实例,我需要使其可序列化。这个类有一个静态变量,会在每个存储的实例中序列化吗?

静态变量是对包含后台大量数据的缓存的引用。所有这些数据都会被序列化吗?如果是这样,最好使此变量为瞬态并在每次恢复实例时重新获取缓存实例。可能根本不在类中存储缓存实例。

当类从序列化状态恢复时,构造函数会执行吗?如果没有,我可以使用其他方法来恢复瞬态变量吗?

【问题讨论】:

  • 执行最多派生的不可序列化超类的无参数构造函数,但不执行序列化类的构造函数。 readObject(或 readObjectNoData 可以替换默认的反序列化(参见 API 文档)。
  • @Tom,替换?那么,如果我实现其中一种方法,我需要自己处理所有的序列化吗?
  • Trumstedt 通常您会提供(而不是覆盖)readObject。该方法应该做的第一件事是调用defaultReadObjectreadFields
  • @Tom,好的,我明白了。现在,如果我有一个未序列化的静态字段,我需要确保在 readObject 方法中,如果静态字段没有值(还没有其他类分配它),则再次实例化该静态字段?

标签: java serialization


【解决方案1】:

这个类有一个静态变量,将 这在每个实例中都被序列化 存储?

没有。根据Java Object Serialization Specificaiton:“类的默认可序列化字段被定义为非瞬态和非静态字段。”

当类从序列化状态恢复时,构造函数会执行吗?

没有。反序列化绕过构造函数(除非你有一个不可序列化的超类)。

如果没有,我可以使用其他方法来恢复瞬态变量吗?

您可以为此使用readObject() 方法,如Serializable API 文档中所述。

【讨论】:

  • 你总是有一个不可序列化的超类。
【解决方案2】:

静态和瞬态字段不被序列化。不,构造函数没有被调用。更多详情请查看:http://java.sun.com/developer/technicalArticles/ALT/serialization/

【讨论】:

  • 静态可以序列化,可以看ecst.csuchico.edu/~amk/foo/advjava/notes/serial.htm
  • 感谢您的回复,但请检查链接。我无法让它工作。虽然我对这个问题的解释是每个实例都会默认序列化一个静态变量,并且 afaik,序列化的默认行为是静态数据不被序列化,因为它不被认为是对象状态的一部分。
  • 谢谢,很好的链接,它确实解释了如何序列化特定于类的信息,它不应该与实例信息一起序列化是有道理的。我有 Horstmann 和 Cornell 的 Core Java —— 一本很棒的书。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多