【问题标题】:Hibernate Deserialization Issue休眠反序列化问题
【发布时间】:2012-03-23 06:32:57
【问题描述】:

我正在尝试更新一些其他人过去编写的休眠代码并遇到反序列化问题。原始代码的编写方式,它没有显式声明 serialVersionUID,只是实现了 Serializable 接口 -

public class SamplePOJO implements Serializable {

现在,我正在尝试向表中添加一个新列并将其映射到该对象。我:

  1. 更改表以创建新列
  2. 更新了对象以包含新的字符串对象和 getter/setter 为此,并且
  3. 更新了 .hbm 文件以将 db 表列与对象映射。

但是,当我在编译后运行它时,出现以下错误 -

"Error while deserializing from byte[]., caused by x.y.SamplePOJO; local class incompatible: stream classdesc serialVersionUID = 7997933458932550222, local class serialVersionUID = <other number internally auto generated as  source didn't explicitly mention serialVersionUID>"

如果我更新代码以包含与上述错误中引发的匹配的 serialVersionUID,它会毫无问题地执行。

根据我发现的信息,最常见的原因似乎是客户端和服务器中的休眠 jar 不同。但是,这里不是这种情况,因为它使用相同的休眠 jar。如果有一种方法可以解决此问题而无需特别提及异常期间引发的 serialVersionUID,有人可以提供帮助吗?另外,如果我必须坚持这种方法,并且如果我的代码移动到另一个环境(qa/prod),它是否会根据它在其他环境中的序列化方式而期望不同的 serialVersionUID?

我将不胜感激任何/所有帮助!

【问题讨论】:

    标签: java hibernate serialization deserialization


    【解决方案1】:

    首先要回答您的第二个问题,JVM 在运行时生成的 serialVersionUID 由 Java 对象序列化规范指定。虽然在运行时生成的 serialVersionUID 是可预测的,但它可能因 java 编译器而异,因为它取决于编译器实现特定的类文件的组成。所以你编译的代码不应该在不同环境下运行时生成不同的serialVersionUID。您可以使用 JDK 中的 serialver 命令来计算运行时生成的类的 serialVersionUID。

    您谈论在客户端和服务器上拥有休眠 jar,这听起来像是您在两个不同的 JVM 之间序列化您的实体,您确定客户端具有更新的实体类吗?该错误表明您正在尝试反序列化从不同版本的类文件的序列化生成的 byte[]。您要么需要确保反序列化为相同版本的类,要么将 serialVersionUID 添加到类中。

    【讨论】:

    • 谢谢。你澄清了我的疑问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多