关于Java';s可序列化,需要澄清

关于Java';s可序列化,需要澄清,java,serialization,Java,Serialization,在Java中实现Serializable接口时,需要将其设置为serialVersionUIDlong 应该选择默认的还是自动生成的long有什么区别吗? 什么时候应该选择一个而不是另一个? 如果选择了自动生成的long,那么是否应该在事件类中更改它?换句话说,分配给serialVersionUID的值。。它和类的当前结构以及在其中声明的字段和方法有关吗 private static final long serialVersionUID = 1L; private static fi

在Java中实现
Serializable
接口时,需要将其设置为
serialVersionUID
long

应该选择默认的还是自动生成的long有什么区别吗?

什么时候应该选择一个而不是另一个?

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

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

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

这是有意义的,并且可以方便地从1开始,并在每次格式更改时递增


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

默认和自动生成的long之间的主要区别在于,自动生成的串行版本UID基于对象的字段。如果您保存了没有版本id的对象副本,那么使用生成的版本有助于确保与已保存的对象兼容。因此,我倾向于使用生成的版本。在这两种情况下,如果进行了不兼容的更改,则需要更新版本id


第5.6.1节和第5.6.2节描述了哪些更改是兼容的,以及哪些更改将中断序列化。

使用默认串行ID的两个缺点的可能重复:1)它依赖于编译器和版本。如果尝试反序列化到不同的环境,则自动编号可能会随机“中断”。2) 你会得到那些恼人的警告:)只要用“1L”和fugghedaboddit;)@paulsm4:编译器和版本相关?真的吗?@Thilo:来自java.io.Serializable的javadoc:“默认的serialVersionUID计算对类细节高度敏感,这些细节可能会因编译器实现的不同而有所不同。”实际上,更改它毫无意义。这只会破坏所有现有的序列化。相反,您应该做的是,在对象版本控制规则下,通过编写customt序列化方法、serialFields等,竭尽全力保持它们的兼容性。