在项目中,我们有几个序列化的对象。有必要在具有不同JVM(可能是不同版本)的机器上使用这些对象。
我们的对象serialVersionUID是固定的,不会改变,但是我们关注JVM标准对象的serialVersionUID,例如我们的序列化对象中使用的ArrayList / HashSet。
所以问题是,这些serialVersionUID可以在不同版本的JVM之间或不同JVM之间进行更改吗?
或者我们是否必须使用其他序列化机制来支持不同的JVM?
答案 0 :(得分:3)
只有在对类的更改与之前序列化的版本不兼容时,才应更改serialVersionUID。
要查看哪些更改可能会破坏兼容性,请检查Specification
我非常怀疑新版本的Java会对核心类引入任何会破坏兼容性的更改。
答案 1 :(得分:-1)
我们使用serialVersionUID
作为类的版本代码,我们应该在修改类时更改此字段。该字段在反序列化中用作类的标识。
例如,序列化A类对象并将其保存在二进制文件中,稍后可以将文件反序列化为原始对象。但是,如果向A添加字段并且不更改serialVersionUID,则反序列化可能会返回格式错误的对象。如果更改serialVersionUID
,反序列化将拒绝输入并抛出异常。异常优于未知错误。
当且仅当您使用旧的序列化结果来创建已修改类的实例时,才会发生这些错误/异常。如果不使用序列化进行数据持久化,则不会出现任何问题。