我有两个实现Serializable的java类。我将它们都设置为1L的serialVersionUid。
同事说所有类都必须有一个唯一的串行版本uid,如果jvm具有相同的串行版本uid,则jvm会将类视为相等。我认为相等是基于equals方法的结果而不是串行版本uid。
我的理解是,串行版本uid用于指示类的版本,并且当类以不兼容的方式更改时,串行版本的uid应该递增。
这是对的吗?是否可以使用1的serialversion uid?或者java类是否永远不会有1L的serialversion uid?
答案 0 :(得分:8)
类名是对象的序列化表示的一部分。 serialVersionUID仅用于对类进行版本控制。所以1L是一个有效值。
请注意,如果您不打算在进行类的同时保持序列化的兼容性,则serialVersionUID是无用的,您可以省略它。如果要对类进行兼容更改并且仍然能够读取使用类的旧版本序列化的对象(反之亦然),则使用serialVersionUID非常有用。但这需要极其谨慎,并且远非一项容易的任务。通常应避免使用序列化进行长期存储。如果用于网络目的,对客户端和服务器使用相同的确切类(即同时部署两者)是最简单的策略。
另请注意,您可以通过简单地序列化和反序列化具有与serialVersionUID相同值(1L)的两个不同类的两个对象来轻松证明您的同事他是错的。如果他的理论是正确的,JVM将无法知道如何反序列化对象。