为什么要生成长串行VersionUID而不是简单的1L?

当类在Eclipse中实现Serializable时,我有两个选择:添加默认值或生成。我认为第一个更酷,但很多时候我看到人们使用第二个选项。有什么理由生成?serialVersionUID(1L)serialVersionUID(3567653491060394677L)long serialVersionUID


答案 1

据我所知,这只是为了与以前的版本兼容。仅当您之前忽略了使用 serialVersionUID,然后进行了您知道应该兼容但会导致序列化中断的更改时,这才有用。

有关更多详细信息,请参阅 Java 序列化规范


答案 2

序列化版本 UID 的目的是跟踪类的不同版本,以便执行对象的有效序列化。

这个想法是生成一个对某个版本的类唯一的 ID,然后在向该类添加新详细信息(如新字段)时更改该 ID,这将影响序列化对象的结构。

始终使用相同的 ID,例如意味着将来如果类定义发生更改,从而导致序列化对象的结构发生更改,则在尝试反序列化对象时很可能会出现问题。1L

如果省略ID,Java实际上会根据对象的字段为您计算ID,但我认为这是一个昂贵的过程,因此手动提供一个将提高性能。

以下是一些指向讨论类的序列化和版本控制的文章的链接: