为什么SerialVersionId在java中很长?

为什么SerialVersionId在java中很长?,java,serialization,interface,long-integer,Java,Serialization,Interface,Long Integer,虽然我搜索了很多,但是找不到一个合理的答案。 为什么serialversionuid不能是双精度的?保留serialversionuid长的具体原因是什么?唯一id通常是随机选择的整数。e、 g.UUID是两个长值 使用double要困难得多,因为并非所有64位值都在Java中使用,而且有些值本身并不相等,例如double.NaN 顺便说一句,如果你真的想使用double,你可以这样做 private static final long serialVersionUID = Double.dou

虽然我搜索了很多,但是找不到一个合理的答案。
为什么serialversionuid不能是双精度的?保留serialversionuid长的具体原因是什么?

唯一id通常是随机选择的整数。e、 g.UUID是两个长值

使用double要困难得多,因为并非所有64位值都在Java中使用,而且有些值本身并不相等,例如double.NaN

顺便说一句,如果你真的想使用
double
,你可以这样做

private static final long serialVersionUID = Double.doubleToRawLongBits(1.28);
但我不知道使用浮点值会有什么值。如果你想编码一个版本号,你可以这样做

private static final long serialVersionUID = MAJOR * 1000 + MINOR;

UID在给定的序列化上下文中必须是唯一的,因为它通常由IDE或程序员在创建
Serializable
的实例时计算。对于应该是唯一的东西,
long
数据类型似乎是合理的。这是合理的,因为它是一种隐式数据类型,并且是沿
double
提供的最大数据类型。数据类型越大,在生成唯一ID时发生冲突的可能性就越低。(想象一下,使用
byte
作为serialVersionUID的数据类型。生成“唯一”ID时只有256个可用值,这将导致大量冲突)。与其他
double
值相比,
double
数据类型有其自身的问题
long
没有此类问题。另一方面,使用
字符串
或其他引用类型可能不合适,因为它在空间和时间复杂性方面可能代价高昂。所有这些原因使得
long
成为使用它作为
serialVersionUID
的数据类型的合理选择

有关更多信息,请参阅。我还从中提取了一些片段

序列化运行时将一个版本号(称为serialVersionUID)与每个可序列化类关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类。如果接收方为对象加载的类的SerialVersionId与相应发送方的类的SerialVersionId不同,则反序列化将导致InvalidClassException。可序列化类可以通过声明名为“serialVersionUID”的字段显式声明自己的serialVersionUID,该字段必须是静态的、最终的且类型为long:

如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据该类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化过程中可能会导致意外的InvalidClassException。因此,为了保证不同java编译器实现之间的SerialVersionId值一致,可序列化类必须声明显式的SerialVersionId值。还强烈建议显式serialVersionUID声明在可能的情况下使用private修饰符,因为此类声明仅适用于立即声明的类——serialVersionUID字段不可用作继承成员。数组类不能声明显式的serialVersionUID,因此它们始终具有默认的计算值,但数组类不需要匹配serialVersionUID值


希望这有帮助

为什么使用double类型的id会有用?因为
Serializable
的javadoc这么说?因为
long
具有更多的精度。因为
long
是精确的。因为不需要
double
的小数部分。因为在任何方面,
double
都是无以伦比的。因为他们都这么说。
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;