java - 为什么serialVersionUID 对于可序列化类来说是 long 类型

标签 java serialization deserialization

这是否意味着我们可以为单个类拥有所有数量的版本?我想不会。我发现它的原始值要短得多。

What is a serialVersionUID and why should I use it?没有说明为什么实现这个机制的人选择它作为一个长值。

最佳答案

serialVersionUID 的类型应该是 long,因为它就是这样指定的。请参阅http://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html (特别是第 4.6 节)

UID 为 64 位的原因是,如果使用 32 位值,则意外 UID 冲突的风险会太高。

默认的串行版本 UID 生成方案基于类方法和字段创建哈希。有一个小但非零的问题,即两个不同的类将具有相同的默认 UID。如果发生这种情况,那么反序列化器可能不会注意到对象的序列化形式与我们尝试反序列化的类不兼容。然后不好的事情就会发生。

如果使用 32 位 UID,两个不兼容的类具有相同 UID 的几率将为二分之一32。这大约是四十亿分之一。这机会太大了。对于 64 位 UID 值,变化是 264 之一。这大约是十六万亿分之一。 (设计者)认为这是一个可以接受的小概率。

关于java - 为什么serialVersionUID 对于可序列化类来说是 long 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42389421/

相关文章:

java - @JsonUnwrapped 禁用 Jackson 的 fail_on_unknown 属性

java - getLastNonConfigurationInstance() 的问题 - 似乎只返回 null

java - 在 Java 中设置值失败

java - 序列化一个非常大的列表

java - 为什么静态字段没有序列化

c# - 为什么反序列化的 JSON 数组返回 null?

java - 如何转储控制台登录文件

java - 尝试计算两个物体位置之间的距离

mysql - 产品 alpha-num 序列号的数学运算 |数据库设计

c# - 反序列化来自 Json Http 响应的对象列表