Java中默认和生成的串行版本uid之间有什么区别?

Sav*_*via 6 java serialization serialversionuid deserialization

我不知道在Java中在哪里使用默认的serialVersionUID或生成的serialVersionUID

private static final long serialVersionUID = 4125965356358329466L; // generated
private static final long serialVersionUID = 1L; // default
Run Code Online (Sandbox Code Playgroud)

小智 5

序列化版本 ID 用于序列化和反序列化对象。Java 会识别要反序列化的字节是否与本地类版本匹配,如果不匹配,则会抛出异常。这在执行 RMI 或持久对象结构时非常重要。序列化运行时将每个可序列化类与一个版本号关联起来,称为serialVersionUID,它在反序列化过程中使用,以验证序列化对象的发送者和接收者是否已为该对象加载了与序列化兼容的类。

  • 我明白什么是 verison id,但这两者有什么区别? (3认同)

Joh*_*ger 5

如果您没有serialVersionUID为某个Serializable类提供自己的类,那么 Java 会根据该类的详细信息为您生成一个类。某些 IDE 和其他工具可以执行相同的计算,使您能够将生成的计算显式放入serialVersionUID您的类中。如果您想要对类进行更改,同时保持与旧版本的序列化兼容性,那么这样做很有用——在大多数情况下,这是一个有点棘手的工作,但通常是可行的。

另一方面,如果您serialVersionUID手动管理,那么使用普通序列号要容易得多,从 1(或您选择的其他数字)开始,并在类以破坏方式更改时递增序列化兼容性。不过,如果你打算为此烦恼,那么一定要确保做得正确——也就是说,serialVersionUID在适当的时候改变——否则你就达不到全部目的。