我看了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就不会有任何数字吗?这个设计背后的逻辑是什么。serialVersionUID
,它可以是正数或负数。有什么不同。如果serialVersionUID
用于识别目的,我们为什么还需要一个负数?我们还没有用尽所有正数。MirroredTypedException.java
中,serialVersionUID
是269而没有L
。这是我在没有serialVersionUID
时找到的唯一L
。这是为什么? L
是什么意思?快照(此快照不包含所有这些快照)
答案 0 :(得分:1)
serialVersionUID似乎可分为2"类型"
不是真的。他们只是long
。
对于20个字符长的serialVersionUID,它可以是正数或负数。
这些都是随机选择的。如果您在Long.MIN_VALUE
和Long.MAX_VALUE
之间随机选择一个数字,那么大多数情况下它会有19位数字,而一半时间则为负数。
有时它们可能是由某些东西的散列生成的(例如,源代码,xml定义等)。如果哈希函数有任何好处,那么数字的分布将与随机选择相同。
为什么? L?
是什么意思?
L
identifies a literal of type long
。 269
不需要它,因为它符合int
的范围,并会自动向上转换为long
。