为什么对串行版本 UID 使用随机数?

2022-09-04 20:41:30

编辑:随机的意思是一个大的计算数字,对我们作为开发人员没有语义意义

实现可序列化接口时,其最佳实践对于指定串行版本 UID 非常重要。在许多地方,我经常看到使用随机数。例如:

有效的Java(第2版)第312页:

private static final long serialVersionUID = 234098243823485285L;

从 Java 6 中的 String 类中:

private static final long serialVersionUID = -6849794470754667710L;

从 Java 6 中的 ArrayList 类中:

private static final long serialVersionUID = 8683452581122892189L;

等。Even eclipse提供了生成这些随机数的选项(尽管主要的默认值似乎是生成一个串行VersionUID1L)

为什么使用随机数?从1L开始,当它像任何合理的版本控制一样发生变化时,增加到2L不是更有意义吗?我能想到的唯一一次使用看似随机的数字是,如果你没有指定一个 serialVersionUID,并且现在想要这样做(这会将你绑定到运行时自动生成的版本,以提供向后兼容性支持)。


答案 1

这些“随机”数字可能是根据Java对象序列化规范以“当前”形式自动为类生成的数字...其中“当前”是“首次声明时的当前”。serialVersionUID

这将使以前序列化的数据仍然被反序列化,同时向前推进到更明确地声明将来的重大更改。


答案 2

几乎可以肯定它们不是随机数,而是工具的输出。serialver