Java-バイナリシリアル化オブジェクトのserialVersionUIDの変更
-
22-07-2019 - |
質問
数か月前、java.io.Serializableオブジェクトをファイルにシリアル化しました。今、私は内容を読む必要がありますが、それ以来serialVersionUIDが変更され、今では「クラス互換性なし」を取得しています。エラー。データメンバはどれも変更されていないという事実を知っているので、唯一の障壁はserialVersionUIDチェックです。
チェックを無効にする方法、またはバイナリファイルのserialVersionUIDを変更する方法はありますか?
明確化
この質問は、ソースを編集できないと仮定しています。 .classファイルをハッキングする方法や、シリアル化されたオブジェクトファイルをハッキングする方法はありますか(16進エディターを使用して、特定のオフセットで値を変更します)?
解決
ハッキングとして、serialverツールを使用して、jvmがおそらく使用しているserialVerを生成できます。
serialver -classpath com.foo.bar.MyClassが何であれ
クラスにserialVerUIDを手動で設定する場合、無効にするような方法でクラスを変更していないと仮定して、一致する必要があり、ロードできる必要があります。
他のヒント
シリアル化ドキュメント?
最近、似たような状況にいることに気づきました-読み取りが必要なシリアル化されたオブジェクトがいくつかあり、それらのオブジェクトの serialVersionUID
は最新バージョンとは異なり、私の場合は同じクラスのファイルに保存されている2つの異なる serialVersionUID
(明らかに異なる時間に保存されています)。そのため、クラスを変更して serialVersionUID
を設定する余裕はありませんでした。実際に、保存されたデータを変更する必要がありました。
(java.ioのソースコードを読んで)私が理解したのは、最初にクラス名を保存して( writeUTF()
を使用)、次にを使用してすぐにオブジェクトがシリアル化されることですwriteLong()
を使用して、 serialVersionUID
を保存します。
私の解決策は、例外をキャッチしてから戻ってクラス名を探し、クラス名の直後に古い serialVersionUID
を新しいものに置き換えることでした。
シリアル化は、データの永続化に使用することを目的としていないことが文書化されています。そのデータを取り戻すには、JVMのバージョンをそのデータの出力に使用されたバージョンにダウングレードする必要があります。
今後の参照のために、JVMのセッション間でデータを永続化するためにシリアル化を使用しないでください。