質問

多くのシリアル化を使用する生産システムがあります。基本的には、JBPMデータベースにProcessDataと呼ばれるオブジェクトをバイト配列として保存することです。したがって、これはシリアル化されています。

次のオブジェクトを検討してください。

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ライブラリに対する制御が限られていることを忘れないでください。

役に立ちましたか?

解決

どちらの場合でもサンプルコードを使用していないように見えます。例では、シリアルバージョンルイドを定義しており(これは良い)、前後に同じですが、エラーではUIDは異なります。これを発生させるために、UIDは定義されていない(生成された)か、バージョン間で変更されています。生成されたケースは、クラスの署名が異なるため、バージョン間の変更も引き起こします。

どちらの場合でも、これは予想される動作になります。

実行される実際のコードが実際にあなたの例と一致しないようです。古いコードをロードするには、永続的なクラス(6651422488035743444L)に既に存在するものと一致するように、新しいバージョンにUIDを設定する必要があります。また、バージョン1,2,3などの単純な数字を使用する場合、UIDを管理する方が簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top