2012-03-05 65 views
3

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

public class SamplePOJO implements Serializable { 

现在,我想一个新列添加到表,并将其映射到该对象。我:

  1. 变更的表创建
  2. 更新的对象,包括一个新的String对象和getter /为二传手 新列,
  3. 更新.hbm文件与数据库表列映射目的。

然而,当我编译后运行它,我得到以下错误 -

"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

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

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

+0

谢谢。你澄清了我的疑问。 – JUG 2012-04-05 15:27:49