java标准对象的serialVersionUID可以改变吗?

时间:2013-07-25 10:00:16

标签: java serialization jvm

在项目中,我们有几个序列化的对象。有必要在具有不同JVM(可能是不同版本)的机器上使用这些对象。

我们的对象serialVersionUID是固定的,不会改变,但是我们关注JVM标准对象的serialVersionUID,例如我们的序列化对象中使用的ArrayList / HashSet。

所以问题是,这些serialVersionUID可以在不同版本的JVM之间或不同JVM之间进行更改吗?

或者我们是否必须使用其他序列化机制来支持不同的JVM?

2 个答案:

答案 0 :(得分:3)

只有在对类的更改与之前序列化的版本不兼容时,才应更改serialVersionUID。

要查看哪些更改可能会破坏兼容性,请检查Specification

我非常怀疑新版本的Java会对核心类引入任何会破坏兼容性的更改。

答案 1 :(得分:-1)

我们使用serialVersionUID作为类的版本代码,我们应该在修改类时更改此字段。该字段在反序列化中用作类的标识。

例如,序列化A类对象并将其保存在二进制文件中,稍后可以将文件反序列化为原始对象。但是,如果向A添加字段并且不更改serialVersionUID,则反序列化可能会返回格式错误的对象。如果更改serialVersionUID,反序列化将拒绝输入并抛出异常。异常优于未知错误。

当且仅当您使用旧的序列化结果来创建已修改类的实例时,才会发生这些错误/异常。如果不使用序列化进行数据持久化,则不会出现任何问题。