【问题标题】:Why does java de/serialization succeed even between incompatible object versions?为什么即使在不兼容的对象版本之间,java 反序列化也会成功?
【发布时间】:2012-05-18 14:29:05
【问题描述】:

在客户端-服务器设置中,我修改了服务器发送的对象的类定义,预计会在客户端崩溃(客户端 jar 尚未更新以反映这些更改)。

不过,它不会崩溃。

注意:客户端使用对象的方式,可能会避免崩溃。客户端从不强制转换反序列化的对象,也从不使用已删除的字段。该对象仅通过 Jython 从 Python 脚本中使用,它可能在使用对象的字段时采用了一些后期绑定机制(反射?),因此使事情成为可能。这也假设序列化包括类的签名,这是真的(在 ObjectOutputStream 的文档中提到)。

还要注意:我们从不更改 serialVersionUid。

我的推理是否正确?

【问题讨论】:

    标签: java serialization late-binding


    【解决方案1】:

    仅当您不提供 serialVersionUID 时,序列化才会使用类签名生成版本控制,因为您提供了一个,所以不会使用类签名。

    由于它没有改变,它假定两者都兼容并执行默认行为

    【讨论】:

    • 好的,所以我使用的是始终保持 =1 的 SerialVersionUID。您是说“未使用”类签名。那么,java 是如何从流中提取一个类未知的对象的呢?
    【解决方案2】:

    如果您在课堂上使用serialVersionUID,那么您可以自行更改它。

    否则,如果有任何更改,java 将依赖反射来引发异常。

    【讨论】:

    • 在我的情况下,我正在反序列化为一个具有额外字段的类(来自不提供它的流)。我的 serialVersionUID 是相等的。不会抛出异常,尽管根据规范,这应该是一个重大更改。
    【解决方案3】:

    只要 serialVersionUID 匹配,删除字段并不是不兼容的更改。请参阅对象序列化规范的对象版本控制章节。

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多