反序列化问题

时间:2010-08-26 16:11:15

标签: java serialization jbpm

我们有一个使用大量序列化的生产系统。基本上做的是将一个名为ProcessData的对象作为字节数组存储在jbpm数据库中。因此这是序列化的。

考虑以下对象。

public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }
}

现在假设我们将这个对象存储在JBPM数据库中作为字节数组,我们在生产中使用它。

现在我们想要使用新数据

升级此ProcessData对象
public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }

  public void getY() {
    //not important
  }
}

现在问题是当JBPM加载old存储的ProcessData对象时,我们得到一个异常 Caused by: java.io.InvalidClassException: my.package.ProcessData; local class incompatible: stream classdesc serialVersionUID = 6651422488035743444, local class serialVersionUID = -7966721901330644987

现在我的问题是,我们如何解决这个问题?我们如何在这个新类中读取序列化对象并对其进行转换。它甚至可能吗? 请记住,我们对JBPM库的控制有限。

1 个答案:

答案 0 :(得分:2)

在任何一种情况下,您似乎都没有使用示例代码,因为在您的示例中您定义了serialVersionUID(这很好)并且前后相同,但在您的错误中,UID是不同的。为此,UID未定义(因此生成),或者在版本之间已更改。由于类签名不同,生成的案例也会导致版本之间发生变化。

在任何一种情况下,这都是预期的行为。

看起来正在运行的真实代码实际上并不符合您的示例。要加载旧代码,您必须在新版本中设置UID以匹配持久类中已存在的UID(6651422488035743444L)。此外,如果您使用简单的数字,如版本1,2,3,则管理UID更简单。