我们有一个使用大量序列化的生产系统。基本上做的是将一个名为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库的控制有限。
答案 0 :(得分:2)
在任何一种情况下,您似乎都没有使用示例代码,因为在您的示例中您定义了serialVersionUID(这很好)并且前后相同,但在您的错误中,UID是不同的。为此,UID未定义(因此生成),或者在版本之间已更改。由于类签名不同,生成的案例也会导致版本之间发生变化。
在任何一种情况下,这都是预期的行为。
看起来正在运行的真实代码实际上并不符合您的示例。要加载旧代码,您必须在新版本中设置UID以匹配持久类中已存在的UID(6651422488035743444L)。此外,如果您使用简单的数字,如版本1,2,3,则管理UID更简单。