【问题标题】:What changes can make serialized class versions incompatible?哪些更改会使序列化的类版本不兼容?
【发布时间】:2010-10-29 15:31:05
【问题描述】:

我正在尝试使用 java 序列化 API 来创建小型持久对象。在我的研究中,我发现了很多关于版本控制的重要性,因此您可以检测和处理存储对象模型和当前对象模型之间的不兼容更改。

我似乎找不到对象模型的哪些更改实际上会破坏兼容性。删除原始成员变量会破坏它吗?加一个吗?

对 Serializable 类的哪些更改会导致 readObject/writeObject 函数在没有适当的版本差异处理的情况下崩溃?

【问题讨论】:

    标签: java serialization versioning


    【解决方案1】:

    如果您定义serialVersionUID,删除或添加一个原始成员不会破坏它(缺少的原始成员将获得它们的默认值)。更多信息:Java Serialization Specification

    【讨论】:

    • 我其实不知道这一点,但考虑到生成的序列化字节包含字段的名称及其值,而不仅仅是值,这是有道理的。
    • 是的;也意味着重排字段是可以的,重命名字段相当于remove+add。只要 serialVersionUID 保持不变,此方法就可以工作。
    • 例如:更改原始字段的声明类型,同时保留名称。详情请参阅规范。
    • @CodeFusionMobile 它将与 java.io.InvalidClassException: local class incompatible Exception 如果我们没有定义 serialVersionUID (应该是静态和最终的)中断
    • @JoonasPulakka,关于您的评论,重命名的字段等同于删除+添加,它可能“工作”,但这并不意味着它以预期的方式工作。从程序员的角度来看,重命名应该获得较早的序列化值,但由于它相当于“删除+添加”的“添加”部分,它将获得默认值。不是程序员的本意。
    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2011-09-07
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多