Java 反序列化问题

Java 反序列化问题,java,serialization,jbpm,Java,Serialization,Jbpm,我们有一个使用大量序列化的生产系统。基本上要做的是将一个名为ProcessData的对象作为字节数组存储在jbpm数据库中。因此,这是序列化的 考虑以下对象 public class ProcessData implements Serializable { private static final long serialVersionUID = -4859440951531011062L; public void getX() { //not important } }

我们有一个使用大量序列化的生产系统。基本上要做的是将一个名为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加载
旧的
存储的ProcessData对象时,我们会得到一个异常
原因:java.io.InvalidClassException:my.package.ProcessData;本地类不兼容:流classdesc serialVersionUID=6651422488035743444,本地类serialVersionUID=-7966721901330644987

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

这两种情况下您似乎都没有使用示例代码,因为在您的示例中,您定义的是serialVersionUID(这很好),前后都是相同的,但在您的错误中,UID是不同的。要实现这一点,UID要么没有定义(因此生成),要么在不同版本之间进行了更改。由于类签名不同,生成的案例还将导致版本之间的更改

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


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

否示例代码正是如此。示例代码。但是,我可以向您保证,
serialVersionUID
是完全相同的。可能UID没有正确声明,因此在其中一个版本中没有实际使用。如果您可以访问旧版本和新版本的.class文件,则可以对它们运行serialver,以确认UID是您期望的UID。假设serialVersionUID是相同的,并忽略此异常。是否可以更改一个类(只添加方法,不更改名称),然后反序列化它以在新类中加载“旧”类?阅读您的评论,底线是:如果我添加方法,我很好。如果我重命名或删除方法,我就完蛋了?给定的UID是相同的。不,如果在类中声明UID,则这些方法对序列化的能力没有影响。这只影响生成的UID,如果显式声明UID,则与此无关。如果已声明UID,则无法获得UID不匹配。您仍然可能因为其他原因而获得异常,但报告的错误表明UID不匹配。