【问题标题】:Why use random numbers for serial version UID? [duplicate]为什么序列版 UID 使用随机数? [复制]
【发布时间】:2013-02-06 03:33:59
【问题描述】:

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

在实现 Serializable 接口时,它的最佳实践是指定串行版本 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 开头并且现在想要这样做(它将您与运行时自动生成的版本联系起来以提供向后兼容性支持)。

【问题讨论】:

  • 我不认为它们是“随机”数字,它们只是看起来很随意。它们可能是类中成员/方法的某种散列。不过,完全是猜测。我没有任何信息支持这种说法。
  • @JonathanNewmuis 是根据方法签名等计算出来的。
  • 你是对的,因为它们是计算值,尽管它们对我们没有意义,它们实际上是随机的
  • @BrianRoach 不完全是同一个问题,因为那只是问为什么应该使用 1L 以外的任何东西。

标签: java serialization


【解决方案1】:

那些“随机”数字可能是按照Java Object Serialization Specification...自动以“当前”形式为该类生成的数字...其中“当前”是“当前”在 serialVersionUID 首次声明时”。

这将允许先前已序列化的数据仍然反序列化 - 同时进一步明确声明未来的重大更改。

【讨论】:

  • Stackoverflow 图例 ^
【解决方案2】:

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

【讨论】:

  • 谢谢,我明白这一点,但是在代码中看到这些数字让我想知道是否所有这些类都忘记在第一个实例中指定 serialVersionUID 并对其进行改造,或者明确选择了计算值(从serialver开始)(如果是,为什么)
  • @ChrisKnight 那么没有办法知道,是吗?我的猜测是 #2,特别是因为代码可能是由技术作家编写的,即使在 17 年后,即使程序员也不是很容易理解的话题。我通常使用 1L 或 -1L 并永远保持这种状态。
猜你喜欢
  • 2014-03-01
  • 2021-12-15
  • 2011-05-21
  • 2013-09-26
  • 2011-07-31
  • 1970-01-01
  • 2016-07-13
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多