的Java规范统计信息
序列化运行时与每个可序列化的类a关联 版本号,称为serialVersionUID,在此期间使用 反序列化以验证序列化的发送方和接收方 object已加载与该对象兼容的类 尊重序列化。如果接收器已加载了一个类 具有与其不同的serialVersionUID的对象 相应的发件人的类,然后反序列化将导致 InvalidClassException。
enter code here
但如果我为所有类分配相同的串行版本ID如下
static final long serialVersionUID = 1L;
现在我的所有类都将具有相同的serialversionUID,这将永远不会导致InvalidclassException。
我知道我们明确地给它,以便它的值在不同的JVM实现中保持不变。
请让我知道在所有类中使用相同的id有什么用,如果我们在序列化和反序列化之间修改类会发生什么?
答案 0 :(得分:5)
我相信serialVersionUID
仅用于确定已经序列化的该类的版本 - 类名也始终存在,因此不会导致任何歧义
请让我知道为所有课程添加相同ID的用途
它们实际上是无关的价值观。只需简单地使用1并在每次进行重大更改时增加它。
如果我们在序列化和反序列化之间修改类会怎么样?
这完全取决于您所做的修改类型。如果您只是添加或删除方法或静态字段,那就没关系 - 这无论如何都不会影响序列化数据。如果您对实例字段进行任何更改,那么当生活变得毛茸茸时,就是。您需要详细研究序列化格式,以确定完全什么构成一个重大变化,但完全有可能只是更改字段的名称可能会破坏事物 - 例如如果字段按名称顺序序列化。
您可能需要考虑使用二进制数据格式,这种格式在数据格式更改时会更愉快,例如Protocol Buffers。 (还有其他好处,例如便携性和速度 - 而protobuf也不是城里唯一的游戏。)