我所看到的绝大多数Java serialVersionUID的示例都有很长的long值-例如,请参见示例here,其中给定的示例是static final long serialVersionUID = 10275539472837495L,甚至是the documentation,其中给出了static final long serialVersionUID = 42L的示例

但是,有什么理由我不能把我的类static final long serialVersionUID = 1L的第一个版本称为第二个2L,以此类推?它的编剧、连载和反序列化都很好,但我想知道是否有更深层的原因使它不是最佳实践.

推荐答案

Serializable Interface Docs:

如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述.但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化过程中可能会导致意外的InvalidClassException.

当您看到像10275539472837495L这样的serialVersionUID时,它很可能是由序列化运行时生成的.

那么,为什么要显式地将serialVersionUID设置为运行时生成的ID呢?假设您忘记将serialVersionUID设置为特定值,例如1L,并且序列化了一个类.过了一段时间,您对实现可序列化接口的类进行了一些更改,然后突然引发了InvalidClassException,因为生成的SerialVersionUID不再匹配.为了解决这个问题,可以显式地将serialVersionUID设置为使用以前的版本生成的版本.这就是人们最终可能得到这些长SerialVersionUID的方式.

为了避免这种情况,建议显式声明serialVersionUID值,如文档中所述.

Java相关问答推荐

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

无法在Java中将hhmmss格式的时间解析为LocalTime

Java Streams在矩阵遍历中的性能影响

Spring boot:Bean和动态扩展器

H2弹簧靴试验跌落台

是否保证在事务性块的末尾标记违反约束?

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

Arrays.hashcode(int[])为不同的元素提供相同的散列

如何将Java文档配置为在指定的项目根目录中生成?

使用正则表达式从字符串中提取多个值

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

我的代码是线程安全的吗?[Java、CAS、转账]

如何在Java中使用正则表达式拆分字符串

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

如何制作回文程序?

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

转换为JSON字符串时,日期按天递减-Java