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

有帮助吗?

解决方案

看起来您在任何一种情况下都不使用示例代码,因为在示例中,您定义了serialversionuid(这很好),并且在之前和之后是相同的,但是在您的错误中,UID是不同的。为了发生这种情况,UID要么未定义(因此生成),要么在版本之间进行了更改。由于类签名不同,因此生成的情况还会导致版本之间的更改。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top