1

シリアル化ツール (つまり、ヘシアン) は、異なるバージョンのクラスを同じものでどのように逆シリアル化しserialVersionUIDますか? ほとんどの場合、不明な (クラス ローダーには見つからない) フィールドをスキップして、互換性を維持できます。しかし前回、新しいフィールド を追加して、Map<String, Object>未知のオブジェクトをマップに追加しようとしたところ、 がスローされましたClassNotFoundException

  • 他のマップのようにスキップできないのはなぜですか?
  • ツールの実装またはシリアル化メカニズムに関連する問題ですか?
4

1 に答える 1

1

これは、ツール自体に依存します。 Hessian のソースを読んでわかる限り、serialVersionUIDJava の組み込みシリアライザー () で使用することを目的としていますが、これは Hessian では使用されません。ObjectOutputStream

特に Hessian の場合、これらの種類の変更について言及している私が見つけることができる最良の情報源は、次の電子メールです。

少なくとも Hessian では、バージョニングを、処理できる一連の種類の変更と考えるのが最善です。

特に Hessian は次の種類の変更を管理できます: 1) フィールドを追加または削除すると、フィールドを理解しない側はそれを無視します。2) Hessian が変換できる場合 (int から long など)、いくつかのフィールド タイプの変更が可能です。

したがって、送信者が型指定されていないマップ {"field1", 10} を送信し、ターゲットが MyValue { int field1; であることがわかっている場合。} の場合、ヘシアンはフィールドをマッピングできます。

ただし、次のようなことは管理できません。1) フィールド名の変更 (データが削除されます)。2) Object field1 のように、ターゲットが未定義のクラス名が変更されます。MyValue2 を新しい field1 として送信すると、以前のバージョンが MyValue1 であった場合、Hessian はその自動遷移を行うことができません。(しかし、上記の #3 と同様に、"MyValue2 field1" は Hessian に変換するのに十分な情報を提供します。) 3) クラスの分割。たとえば、サブクラスを作成していくつかのフィールドをそこにプッシュします。
4) リストにマップするか、変更をマップするリストにマップします。

基本的に、Hessian がマップで未知の型をサポートするつもりはないと思います。

于 2015-04-27T16:57:04.023 に答える