Hibernate反序列化问题

时间:2012-03-05 19:17:03

标签: java hibernate serialization deserialization

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

public class SamplePOJO implements Serializable {

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

  1. 更改表以创建新列
  2. 更新了对象以包含新的String对象和getter / setter 为此,和
  3. 更新了.hbm文件以将db表列与对象映射。
  4. 但是,当我在编译后运行它时会出现以下错误 -

    "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,则执行时没有任何问题。

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

    我将非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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