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
  }
}

oldここで問題となるのは、JBPMが保存された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が定義されていない(したがって生成されていない)か、バージョン間で変更されています。クラスの署名が異なるため、生成されたケースによってバージョン間で変更が発生します。

いずれの場合も、これは予想される動作になります。

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

于 2010-08-26T16:17:15.613 に答える