- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我和一位同事就可序列化类的 serialVersionUID 进行了讨论:他总是以 serialVersionUID = 1L
开始,然后在类发生重大变化时将其递增 1。
JDK 类似乎总是使用更复杂、生成java.lang.String
类中的 serialVersionUID:
private static final long serialVersionUID = -6849794470754667710L;
现在我的同事询问这种 serialVersionUID 与更简单的 serialVersionUID(如 1L、2L、3L...)相比的优势?
我们也在 SOF 上进行了搜索,但对给出的答案不是很满意,例如 Why generate long serialVersionUID instead of a simple 1L? .
在我看来,使用生成的 ID 的优势在于它不需要有关“旧”类版本的任何信息。但是当手动增加 ID 时,您必须知道到目前为止的最高值。这听起来可能微不足道(只需查看当前的 serialVersionUID 并将其增加 1),但在更大的软件项目、更大的开发团队或分布式环境中可能会更复杂。
最佳答案
使用生成的版本的优点是,如果它在没有 serialVersionUID
的情况下逃逸到野外,它与该类的先前版本兼容。
话虽如此,您的同事增加它几乎肯定是错误的。 serialVersionUID
只应在您接受类已发生不可挽回的更改并且您有意引入序列化不兼容的情况下更改。这种情况在自然界中很少见,仅限于以不兼容的方式更改类的继承或成员字段类型的情况。如果您决定制作一个类 Serializable
,您应该已经接受了一个不会发生这种情况的制度。
关于java - 生成 serialVersionID 而不是 1L、2L、,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40615456/
当 serialVersionId 未存储在序列化对象中时,反序列化过程如何知道序列化对象的 serialVersionId,这需要与将要转换为的类的序列版本 ID 进行比较,以检查它是否兼容? 最佳
当对象被序列化时,它不存储对象的静态和 transient 。那么反序列化时如何验证serialVersionUID的静态值呢?至于反序列化时的验证,对象和类都必须存储序列版本引用。但是,对象在序列化
我有一个类似的类(class) class Stundent { private static final long serialVersionUID = 1L; private in
我和一位同事就可序列化类的 serialVersionUID 进行了讨论:他总是以 serialVersionUID = 1L 开始,然后在类发生重大变化时将其递增 1。 JDK 类似乎总是使用更复杂
这是我的代码: MyOwnObject deserializedObject = null; try{ ByteArrayInputStream bis = new ByteArrayInpu
这个问题在这里已经有了答案: What is a serialVersionUID and why should I use it? (25 个答案) 关闭 4 年前。 在我的类(class)中,我
我是一名优秀的程序员,十分优秀!