4

コードには、Serializable を実装する Java クラスがあります。このクラスには、既に serialVersionUUId が定義されています。それとは別に、別のものもあります

整数である static final String sVersion。このクラスは、 readObject および writeObject api を実装します。readObject API では、InputStream を使用してすべてのメンバー変数に値を設定し、writeObject API では、OutputStream を取得して writeObject メソッドを呼び出します。

次に、このクラスのプロパティとしてブール値の配列を追加する必要があります。serialVersionUUID を変更する必要がありますか? バージョン ID を変更する/変更しない場合、どのような影響がありますか? ベスト プラクティスは何ですか?私は Joshua bloch による効果的な Java に取り込もうとしていますが、これについては簡単に理解できる答えが必要です。

ありがとう

4

2 に答える 2

2

このクラスは、readObject および writeObject API を実装します。readObject API では、InputStream を使用してすべてのメンバー変数を設定し、writeObject API では、OutputStream を取得して writeObject メソッドを呼び出します。

なんで?これらのメソッドをまったく提供しない場合、これがデフォルトのアクションです。[「OutputStream を取得する」とは正確には何を意味するのかわかりませんが、パラメーターとして提供されたものを意味する場合を除きます。]

ただし、ここまで来たらreadObject()、あとは新しいフィールドを読み取って、そこにない場合 ( OptionalDataException?) にスローされる例外をキャッチwriteObject()し、余分なフィールドを書き出すだけです。

を変更しないでくださいserialVersionUID代わりに、シリアライゼーションの広範なオブジェクト バージョニング サポートを調査する必要があります。(b) カスタムの read/writeObject() メソッド、readResolve/writeReplace() メソッド、serializableFields 宣言などのスキームを試して、ストリームの互換性が維持されていることを確認します。実際の serialVersionUID を変更するのは最後の手段であり、絶望的な助言です。

先に進む前に、 Object Serialization Specification の Object Versioning セクションをよく確認する必要があります。シリアライゼーションは、この質問に対する他の回答者や、彼らがリンクしている質問を含め、ほとんどの人が認識しているように見えるよりも、クラスの進化をより多くサポートしています。

于 2012-12-12T00:54:07.747 に答える
0

互換性のないクラスのインスタンスを逆シリアル化しようとする可能性がある場合は、そうです。serialVersionUID を確実に更新する必要があります。一方、プログラムがデータを永続ストレージに保存せずに常にシリアライズおよびデシリアライズする場合、またはクラスとその呼び出し元の間のコントラクトを引き続き保証できる場合は、serialVersionUID を変更する必要はありません。

詳細については、 https://stackoverflow.com/a/286254/44737およびhttps://stackoverflow.com/a/285827/44737を参照してください。

于 2012-12-12T00:00:51.703 に答える