java - 1L的Java SerialVersionUid可以吗?还是必须是独一无二的?

标签 java serialization serialversionuid

我有两个实现 Serializable 的 java 类。我将它们都设置为具有 1L 的 serialVersionUid。

一位同事说,所有的类都必须有一个唯一的串行版本 uid,如果类具有相同的串行版本 uid,jvm 会将它们视为平等的。我认为相等性是基于 equals 方法的结果而不是串行版本 uid。

据我了解,串行版本 uid 用于指示类的版本,并且当类以不兼容的方式更改时,串行版本 uid 应该递增。

这样对吗?使用 1 的 serialversion uid 可以吗?或者 Java 类不应该有 1L 的 serialversion uid?

最佳答案

类名是对象序列化表示的一部分。 serialVersionUID 仅用于对类进行版本控制。所以 1L 是一个有效值。

请注意,如果您不打算在类演进时保持序列化的兼容性,则serialVersionUID 无用,您可以忽略它。当您想要对类进行兼容更改并且仍然能够读取使用该类的旧版本序列化的对象(反之亦然)时,拥有 serialVersionUID 非常有用。但这需要格外小心,而且绝非易事。您通常应该避免使用序列化进行长期存储。如果用于网络目的,为客户端和服务器使用完全相同的类(即同时部署两者)是最简单的策略。

另请注意,您可以通过简单地序列化和反序列化具有与 serialVersionUID 相同的值 (1L) 的两个不同类的两个对象,轻松证明您的同事是错误的。如果他的理论是正确的,那么 JVM 将无法知道如何反序列化对象。

关于java - 1L的Java SerialVersionUid可以吗?还是必须是独一无二的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30716967/

相关文章:

java - 带连字符/破折号的安全角色名称

java - 使用 JRadioButtons 切换类似界面

java - playframework 2.3.4 启动时出现 java 8u25 错误

c# - 泛型的 JSON 序列化

java - 尝试从套接字读取时出现非法阻塞模式异常

java - 查找序列化对象的serialVersionUID

java - 根据列值更改 JTable 行的背景颜色

c# - 如何反序列化当前类

java - 如何为匿名类生成 serialVersionUID?

java - java中默认和生成的串行版本uid有什么区别?