【问题标题】:Add a serialVersionUID to a serializable class that is already in use将 serialVersionUID 添加到已在使用的可序列化类
【发布时间】:2011-08-02 14:47:46
【问题描述】:

我有一个 Serializable 类,大约从 2004 年开始在生产中使用。但是,编写它的人忘记生成 serialVersionUID

整个事情有点工作(有一个很大的评论警告不要碰课堂上的任何东西),但是在一个相关的不同班级工作时,我有一个InvalidCastException,所以我想添加serialVersionUID以确保该类正常工作。

问题是,是否可以在不破坏现有序列化实例的情况下添加这样的字段?它们有很多,并且没有简单的方法来修改它们。

我的想法来自于看到异常消息,大致如下:

java.io.InvalidClassException: the.problematic.Class; local class incompatible: stream classdesc serialVersionUID = -8802277085918151566, local class serialVersionUID = -3137213695071887162"

我认为我可以使用隐式序列(跟踪中的流 classdesc)作为序列,它应该保持向后兼容性。它是否正确?我(或多或少)确定我们在系统中获得的所有序列化实例都是相同的版本。

【问题讨论】:

    标签: java serialization legacy


    【解决方案1】:

    是的,为 serialVersionUID 指定与计算值完全相同的值应该可以防止向后兼容(例如,Eclipse 有一个选项可以做到这一点,称为“添加生成的序列版本 ID”)。

    【讨论】:

    • 我明白了,我不确定这个 id 的计算方式是否在 jdk 版本中定义和不变
    【解决方案2】:

    您必须小心,如果您检查从序列化流中读取的 serialVersionUID(简单:只需更改对象并将其读入,异常会告诉您预期值),您可以将其放入您的代码中并它将适用于这个特定的环境。然而,另一个平台上的另一个 JDK(例如 IBM 与 SUN)可能具有不兼容的不同 serialVersionUID。 (最坏的情况是您需要从支持的 VM 的已知值列表中计算 serialversionuid)。

    【讨论】:

      猜你喜欢
      • 2015-11-11
      • 1970-01-01
      • 2017-07-15
      • 2017-09-14
      • 1970-01-01
      • 2017-07-29
      • 2015-04-21
      • 2011-09-21
      • 1970-01-01
      相关资源
      最近更新 更多