serialVersionUID没有L,xxxxxxxxxxxxxxxxxL vs 1L,正面vs负面

时间:2017-08-18 16:44:32

标签: java serialization jdk1.7

我看了What is a serialVersionUID and why should I use it?static final long serialVersionUID = 1L。从这两篇SO帖子中我大致了解它是什么。它是Serializable类的ID,用于检查发送方和接收方在反序列化期间是否兼容。如果不是,则抛出InvalidClassException

但是我对一些事情感到好奇:

  • serialVersionUID似乎分为2"类型"。 19个数字后跟L xxxxxxxxxxxxxxxxxxxL或269L或1L。这些数字似乎没有被任意选择。如果我们只需要一个ID就不会有任何数字吗?这个设计背后的逻辑是什么。
  • 对于20个字符长serialVersionUID,它可以是正数或负数。有什么不同。如果serialVersionUID用于识别目的,我们为什么还需要一个负数?我们还没有用尽所有正数。
  • MirroredTypedException.java中,serialVersionUID是269而没有L。这是我在没有serialVersionUID时找到的唯一L。这是为什么? L是什么意思?

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

enter image description here

1 个答案:

答案 0 :(得分:1)

  

serialVersionUID似乎可分为2"类型"

不是真的。他们只是long

  

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

这些都是随机选择的。如果您在Long.MIN_VALUELong.MAX_VALUE之间随机选择一个数字,那么大多数情况下它会有19位数字,而一半时间则为负数。

有时它们可​​能是由某些东西的散列生成的(例如,源代码,xml定义等)。如果哈希函数有任何好处,那么数字的分布将与随机选择相同。

  

为什么? L?

是什么意思?

L identifies a literal of type long269不需要它,因为它符合int的范围,并会自动向上转换为long