所有类的相同串行版本ID?

时间:2014-09-25 17:56:31

标签: java serialization deserialization

的Java规范统计信息
  

序列化运行时与每个可序列化的类a关联   版本号,称为serialVersionUID,在此期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与其不同的serialVersionUID的对象   相应的发件人的类,然后反序列化将导致   InvalidClassException。enter code here

但如果我为所有类分配相同的串行版本ID如下

static final long serialVersionUID = 1L;

现在我的所有类都将具有相同的serialversionUID,这将永远不会导致InvalidclassException。

我知道我们明确地给它,以便它的值在不同的JVM实现中保持不变。

请让我知道在所有类中使用相同的id有什么用,如果我们在序列化和反序列化之间修改类会发生什么?

1 个答案:

答案 0 :(得分:5)

我相信serialVersionUID仅用于确定已经序列化的该类的版本 - 类名也始终存在,因此不会导致任何歧义

  

请让我知道为所有课程添加相同ID的用途

它们实际上是无关的价值观。只需简单地使用1并在每次进行重大更改时增加它。

  

如果我们在序列化和反序列化之间修改类会怎么样?

这完全取决于您所做的修改类型。如果您只是添加或删除方法或静态字段,那就没关系 - 这无论如何都不会影响序列化数据。如果您对实例字段进行任何更改,那么当生活变得毛茸茸时,就是。您需要详细研究序列化格式,以确定完全什么构成一个重大变化,但完全有可能只是更改字段的名称可能会破坏事物 - 例如如果字段按名称顺序序列化。

您可能需要考虑使用二进制数据格式,这种格式在数据格式更改时会更愉快,例如Protocol Buffers。 (还有其他好处,例如便携性和速度 - 而protobuf也不是城里唯一的游戏。)