10

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

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

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

那是对的吗?可以使用 1 的 serialversion uid 吗?或者java类不应该有1L的serialversion uid?

4

1 回答 1

16

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

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

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

于 2015-06-08T19:06:17.410 回答