【发布时间】:2011-07-31 08:50:48
【问题描述】:
为什么序列化在实现的类中需要序列版本 UID?
【问题讨论】:
标签: java serialization
为什么序列化在实现的类中需要序列版本 UID?
【问题讨论】:
标签: java serialization
您是在问为什么要使用 UID?
所以它知道两个序列化对象是否相互兼容。您可能已经更改了接口/方法/等。
UID 是(诚然相当蹩脚的)合同,它说这两个对象实际上是同一类型的对象。
【讨论】:
来自the doc for java.ioSerializable:
序列化运行时将一个版本号与每个可序列化类相关联,称为 serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收者为对象加载了一个类,该对象的serialVersionUID 与相应发送者的类不同,则反序列化将导致
InvalidClassException。可序列化类可以通过声明一个名为"serialVersionUID"的字段来显式声明自己的 serialVersionUID,该字段必须是静态的、最终的和 long 类型的
【讨论】:
serialVersionUID 在 Serializable 类中用作版本控制。如果您没有显式声明 serialVersionUID,JVM 将根据您的 Serializable 类的各个方面自动为您完成,如 Java(TM) Object Serialization Specification 中所述。
【讨论】:
为什么序列化需要一个 已实现的序列版 UID 上课?
它根本不需要它。这是一项可选功能。
【讨论】:
ObjectOutputStream 和朋友。它仍然是可选的,并且它仍然不是由编译器生成的。不要在这里发布错误信息。
However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization 意味着不同的编译器实现会导致不同的 serailVersionUID,因此我提到了“编译器”。请刷新您的信息