在Java的Serializable上,需要澄清

时间:2012-07-04 03:30:40

标签: java serialization

在Java中实现Serializable接口时,我们需要将其设置为serialVersionUID长。

是否应选择默认值或自动生成的长度是否存在差异?

什么时候应该优先于另一个?

如果选择了自动生成的long,是否应该在事件类中更改?换句话说,分配给serialVersionUID的值是它与类的当前结构以及在那里声明的字段和方法有关吗?

private static final long   serialVersionUID    = 1L;
private static final long   serialVersionUID    = 6749067740891125834L;

2 个答案:

答案 0 :(得分:2)

默认长度和自动生成的长度之间的主要区别在于自动生成的串行版本UID基于对象的字段。如果您持有没有版本ID的对象的副本,则使用生成的版本可以帮助确保与已持久的对象的兼容性。因此,我倾向于使用生成的版本。在任何一种情况下,如果进行了不兼容的更改,则需要更新版本ID。

http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/spec/version.html第5.6.1和5.6.2节描述了哪些更改是兼容的以及哪些更改会破坏序列化。

答案 1 :(得分:1)

串行版UID可以是任意数字,其值没有特定含义。

使用1启动它很方便,并且每次格式更改时都会增加它。

但是,如果从一开始就考虑过它,那么你只能这样做。如果您已经拥有需要继续读取的现有数据,则此数据将具有自动生成的ID。在这种情况下,您别无选择,只能匹配该值。