java - 为什么序列号版本的UID使用随机数?

标签 java serialization

<分区>

编辑:我所说的随机是指一个大的计算数字,对我们开发人员来说没有语义意义

在实现 Serializable 接口(interface)时,指定串行版本 UID 是最佳实践,也是非常重要的。在许多地方,我经常看到使用随机数。例如

Effective 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;

等甚至 Eclipse 也提供了生成这些随机数的选项(尽管主要默认设置似乎是生成 1L 的 serialVersionUID)

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

最佳答案

这些“随机”数字可能是根据Java Object Serialization Specification 以其“当前”形式自动为类(class)生成的数字。 ...其中“当前”是“serialVersionUID 首次声明时的当前”。

这将允许之前序列化的数据仍然反序列化 - 同时在未来更明确地声明中断更改。

关于java - 为什么序列号版本的UID使用随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14991614/

相关文章:

jquery - 如何在提交表单时使用 jQuery 和 jQuery Mobile 在序列化字符串中给出重复项?

java - 为什么 picocli 不能从命令行识别我的选项?

java - Jackcess 可以与 MS Access 2013 一起使用吗?

java - 为什么无法达到我的可变 equipmentNumber?

c# - 如何反序列化然后将数据放入表格?

c++ - MPI 发送自定义序列化对象(更通用的代码)

c# - 创建 MTOM 并反序列化它

c# - 带有 List<T> 的 SerializationBinder

java - 使用模拟测试时无法注入(inject)application.properties中定义的@value

java - 自动更新 map /集并检查大小