增加实现Serializable
的类定义的版本ID的有效和无效原因是什么?
换句话说,什么会引入写 - 读 - 读兼容性?有没有办法改变方法会引入不兼容性?有没有什么方法可以引入不兼容的重构?
编辑阅读链接和答案我看到程序员定义的ID是控制自动ID的方法,使对象太脆弱。如果我控制ID,那么我需要知道管理它的确切规则。
答案 0 :(得分:1)
根据这个answer - 如果我理解正确的话,如果你破坏界面,你几乎必须更改版本ID,比如更改或删除签名。
更改为方法逻辑不会引入不兼容性。
答案 1 :(得分:1)
这是不兼容版本的默认概念通常过于严格。如果添加一个字段,它会更改默认的serialVersionUID,这会阻止您加载旧数据,即使这可能是一个良性的变化。 实际上,流包含对象状态的完整描述,包括其所有字段的名称和类型。此信息由系统存储,通常足以转换旧数据。系统还提供默认转换(跳过意外字段并将缺少的字段设置为默认值),这通常就足够了 - 但如果serialVersionUID不匹配则禁用它。
答案 2 :(得分:1)
来自Oracle,the list of compatible and incompatible changes.要解决这个问题,如果更改是兼容的,则无需更新ID(“无效”),如果更改不兼容,则无效。
答案 3 :(得分:0)
它类似于版本控制系统中的版本控制。您发布了一些正在使用的初始类定义。
现在,稍后你改变了一些类定义。使用不同的类版本将使您的现有客户端正常工作。
根据版本ID,兼容的客户端可以正常工作!