【发布时间】:2012-08-17 07:48:23
【问题描述】:
序列化是将对象定义转换为持久格式(其中格式是特定于平台的)的过程。跨网络传输的对象(RMI、EJB)需要可序列化。 SOAP 请求是基于 xml 的,而 JAXB 用于编组和解组对象 xml。代码质量插件提示我添加 SerialVersionUID。这是必需的吗? CXF/JAXB 内部是否需要这个?
【问题讨论】:
序列化是将对象定义转换为持久格式(其中格式是特定于平台的)的过程。跨网络传输的对象(RMI、EJB)需要可序列化。 SOAP 请求是基于 xml 的,而 JAXB 用于编组和解组对象 xml。代码质量插件提示我添加 SerialVersionUID。这是必需的吗? CXF/JAXB 内部是否需要这个?
【问题讨论】:
据我所知,JAXB 不需要它。您收到此警告是因为您的类实现了 Serializable,但 JAXB 不要求您的类为 Serializable。
如果没有其他原因需要您的类为 Serializable,您可以更改它们,使它们不实现 Serializable。
如果您希望能够使用 Java 的默认序列化机制(例如,RMI 使用的)序列化/反序列化它们,您的类只需要实现 Serializable。
【讨论】:
JAXB 文档中没有提到需要显式添加 SerialVersionUID。
SerialVersionUID 是每个 Serializable 类持有的版本号,用于反序列化以验证序列化对象的发送方和接收方是否保持兼容性,只要序列化关注加载的类。
它不应该是必需的,因为编译器会自己生成一个 SerialVersionUID,所以你不用担心。
计算对类细节非常敏感,因此两个不同的编译器可以计算不同的 SerialVersionUID,在这种情况下,JVN 可能会在反序列化过程中抛出 InvalidClassException。在这种情况下,您应该自己添加 SerialVersionUID。每次修改类时都必须更改 SerialVersionUID 以避免反序列化问题(这是因为如果您始终使用相同的编译器,最好不要指定 SerialVersionUID)。
不要被您的 IDE 所说的误导,这是您根据项目开发要求做出的选择。
【讨论】: