1

数か月前、java.io.Serializableオブジェクトをファイルにシリアル化しました。ここで内容を読み取る必要がありますが、それ以降、serialVersionUIDが変更され、「クラス互換性がありません」というエラーが発生します。どのデータメンバーも変更されていないことを知っているので、唯一の障壁はserialVersionUIDチェックです。

チェックを無効にする方法、またはバイナリファイルのserialVersionUIDを変更する方法はありますか?

明確化

この質問は、ソースを編集できないことを前提としています。.classファイルをハックしたり、シリアル化されたオブジェクトファイルをハックしたりする方法はありますか(16進エディターを使用して、特定のオフセットで値を変更します)?

4

4 に答える 4

2

シリアライゼーションのドキュメントで説明されているように、代わりに現在のバージョンの serialVersionUID を変更してみませんか?

于 2009-01-14T22:20:35.543 に答える
2

ハックとして、serialver ツールを使用して、jvm がおそらく使用している serialVer を生成できます。

serialver -classpath 任意の com.foo.bar.MyClass

次に、クラスにserialVerUIDを手動で設定すると、一致するはずであり、無効にするような方法でクラスを変更していないと仮定して、ロードできるはずです。

于 2009-01-14T22:24:35.457 に答える
2

私は最近、同様の状況に陥っていることに気付きました。読み取る必要のあるシリアライズされたオブジェクトがいくつかありましたserialVersionUID。それらのオブジェクトの は最新バージョンとは異なっserialVersionUIDていました。同じクラス(明らかに異なる時間に保存されます)。serialVersionUIDそのため、クラスを変更してその;を設定する余裕はありませんでした。私は実際に行って、保存されたデータを変更する必要がありました。

私が(java.ioソースコードを読んで)理解したのは、最初にクラス名を保存し(を使用してwriteUTF())、次に使用writeLong()してserialVersionUID.

私の解決策は、例外をキャッチして戻ってクラス名を探し、クラス名の直後に古いものserialVersionUIDを新しいものに置き換えることでした。

于 2009-04-16T13:04:43.697 に答える
-3

シリアル化は、データの永続化に使用することを意図したものではないことが文書化されています。そのデータを取り戻すには、JVMのバージョンをそのデータの出力に使用されたバージョンにダウングレードする必要があります。

今後の参考のために、JVMのセッション間でデータを永続化するためにシリアル化を使用しないでください。

于 2009-01-14T22:16:59.433 に答える