类定义中的序列版本ID

时间:2015-05-29 07:50:43

标签: java serialization

我试图在缓存中添加我的类。如果我这样做会引发错误,如

Caused By: java.io.NotSerializableException: com.test.package.PropertyGroup
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)

所以我开始知道我的对象应该为我的类实现Serializable接口。我已经实现了Serializable接口。但它显示警告我的班级应该有两个选项default serial version IDgenerated serial version ID的序列版本ID。这两者之间有什么区别,即serialVersionUID =1L和一些随机生成的值serialVersionUID = 8243252575074067947L;

2 个答案:

答案 0 :(得分:1)

如果您的类的现有实例已在某处序列化并且您需要对它们进行反序列化,请在当前更改之前使用生成的类版本。这是因为加载到JVM中的类需要与序列化实例具有相同的serialVersionUID。由于序列化实例没有明确设置,因此它将是自动生成的ID。

如果你没有需要反序列化的野外实例,那么默认ID可以更好地阅读,并且更容易根据需要手动增加。

由于您之前从未对此类进行过序列化(因为您刚刚将其标记为Meteor.users.aggregate([ {$unwind:"$profile"}, {$unwind:"$profile.services"}, {$match:{"profile.services.serviceId":service}}, {$sort:{"profile.services.rate":1}} ]); ),因此请使用默认的1L版本。

答案 1 :(得分:0)

生成的值不是随机的。如果在可序列化类中没有指定,则JRE将隐式使用serialVersionUID。

如果您需要保持兼容性,这一点非常重要。在这种情况下,您将在对类进行任何更改之前生成serialVersionUID。之后你可以修改课程,例如通过添加字段,而不会为旧版本的用户造成SerializationErrors。

在您的情况下,这似乎不是问题,因此您可以使用默认选项。但任何一种选择都可行。