2

我们有一个使用大量序列化的生产系统。基本上要做的是将一个名为 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 库的控制有限。

4

1 回答 1

2

看起来您在这两种情况下都没有使用示例代码,因为在您的示例中,您正在定义 serialVersionUID(这很好)并且它之前和之后是相同的,但是在您的错误中,UID 是不同的。为此,UID 要么未定义(因此生成),要么已在版本之间更改。由于类签名不同,生成的案例也会导致版本之间的变化。

无论哪种情况,这都是预期的行为。

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

于 2010-08-26T16:17:15.613 回答