【问题标题】:Serialization - What is the advantage of using ObjectStreamField [] serialPersistentFields?序列化 - 使用 ObjectStreamField [] serialPersistentFields 有什么好处?
【发布时间】:2014-03-12 02:28:11
【问题描述】:

对于实现Serializable 接口的类,有两种方法可以定义在序列化期间流式传输哪些特定字段:

  1. 默认情况下,所有实现Serializable 的非静态、非瞬态字段都会被保留。
  2. 通过定义ObjectStreamField [] serialPersistentFields 并明确声明保存的特定字段。

我想知道,除了可以定义特定字段顺序之外,第二种方法还有什么优势?

【问题讨论】:

  • 啊,我没有看到答案已经被接受了。这个答案是正确的,但我认为它不能回答你的问题“为什么”。

标签: java serialization


【解决方案1】:

“优点”是它执行 Javadoc 中所说的:定义哪些字段被序列化。没有它,所有非瞬态非静态字段都会被序列化。您的选择。

【讨论】:

  • 那么为什么不让它们“瞬态”呢?
  • @aviad 因为它可能会破坏其他东西,或者您可能想使用unshared 功能,...
  • 打破什么? readUnshared() 只会使对象来自的流句柄无效 - 请详细说明(我无法识别相关性)
  • @aviad (a) 打破依赖于非瞬态字段的任何其他内容,例如一些可能的 XML 序列化程序,并且 (b) 您需要查找 writeUnshared():这是一个效果你不能默认得到。
  • @aviad (a) ObjectStreamField 可以有一个 'unshared' 参数 (b) 不难想象替代序列化程序,例如我提到的 XML 序列化程序,它们可能会或可能不会注意到'transient' 字段......所以你会得到不同的行为。 java.beans.XMLEncoder 就是一个例子。
【解决方案2】:

优点是您可以在运行时有条件地填充 ObjectStreamField,尽管每个 JVM 生命周期只能确定应序列化哪些字段。

private static final ObjectStreamField [] osf;
static {
    //code to init osf
}

【讨论】:

    【解决方案3】:

    幸运的是,我现在正在写这篇文章....除了提到的优点(我对非共享的了解不多)之外,编写自己的输出格式似乎还有以下优点:

    • 允许条件输出(序列化的不同用途,例如持久性和复制,可以序列化对象的不同部分)。
    • 应该比默认机制更快,使用更少的内存,并且在某些情况下使用更少的磁盘(这来自 Bloch 的 Effective Java 2)。
    • 允许您重命名序列化类中的变量,同时保持向后兼容性。
    • 允许您访问新版本中已删除字段中的数据(换句话说,在保持向后兼容性的同时更改数据的内部表示)。

    我已经看过您引用的文档,仅提及这 2 个选项有点误导,并且遗漏了很多内容:您可以通过使用 ObjectOutput/InputStream 接口编写以两种方式自定义序列化格式并以特定顺序读取字段(在 Bloch 中描述),并使用 PutField 和 GetField 类按名称写入和读取字段。您可以使用 serialPersistentFields 作为您的报价来扩展第二种方法,但除非您需要读取或写入名称不是成员变量名称的数据,否则它不是必需的。

    还有第三种方法来控制格式,使用 Externizable 接口,虽然我没有探索过那么多。通过序列化代理也可以获得一些优势(参见 Bloch)。

    如果我遗漏了什么,任何人都可以随时纠正我的细节。

    【讨论】:

      【解决方案4】:

      serialPersistentFields 中,您可以指定类中不再存在的字段。

      例如查看 jdk 类java.math.BigInteger,其中读取和写入了类中不再存在的几个字段。为了与旧版本兼容,仍会读取和写入这些过时的字段。这些字段的读写由readObject()writeObject()方法处理。

      另请参阅 http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#6250

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 2012-01-18
        • 2013-08-08
        • 1970-01-01
        • 2012-11-28
        • 2010-09-21
        • 2011-04-28
        相关资源
        最近更新 更多