0

我阅读了什么是 serialVersionUID,为什么要使用它?static final long serialVersionUID = 1L。从这两个 SO 帖子中,我大致了解了它是什么。它是 Serializable 类的 ID,用于在反序列化期间检查发送方和接收方是否兼容。如果不是 aInvalidClassException则抛出。

不过我很好奇一些事情:

  • serialVersionUID似乎分为2个“类型”。19 个数字后跟 L xxxxxxxxxxxxxxxxxxxL 或 269L 或 1L。这些数字似乎不是随意选择的。如果我们只需要一个ID,任何数字都行不通吗?这个设计背后的逻辑是什么。
  • 对于 20 个字符长serialVersionUID,它可以是正数或负数。有什么不同。再次如果serialVersionUID用于识别目的,为什么我们需要有一个负数?我们还没有用完所有的正数。
  • 在269 中MirroredTypedException.java没有. 这是我发现的唯一没有. 这是为什么?是什么意思?serialVersionUIDLserialVersionUIDLL

快照(此快照不包括所有这些)

在此处输入图像描述

4

1 回答 1

2

serialVersionUID 似乎可以分为 2 个“类型”

并不真地。他们都只是longs。

对于 20 个字符长的 serialVersionUID,它可以是正数或负数。

这些都是随机选择的。如果您在 之间随机选择一个数字Long.MIN_VALUELong.MAX_VALUE然后大部分时间它将有 19 位数字,而一半时间它将是负数。

有时它们可​​能是从某物的散列中生成的(例如源代码、xml 定义等)。如果散列函数好,那么数字的分布将与随机选择一样。

这是为什么?L是什么意思?

L标识类型的文字long。不需要它269,因为它适合 的范围int,并且会自动向上转换为long

于 2017-08-18T16:50:44.620 回答