2009-03-03 13 views
37

私はSerializable interfaceを実装するクラス(ArrayBlockingQueue)を拡張しています。 Sunのドキュメント(と私のIDEは)私がいたずらを防止するために、この値を設定する必要があることを私に助言:JavaでSerializableクラスを拡張するときにserialVersionUIDを選択するのは重要ですか?

しかし、デフォルトのserialVersionUIDの計算は非常に敏感であるため、すべての直列化可能クラスが明示的に、serialVersionUIDの値を宣言することを強くお勧めしますクラスの詳細はコンパイラの実装によって異なる可能性があり、デシリアライズ時に予期しないInvalidClassExceptionsが発生する可能性があります。

ここで、私はそこにどのような価値を置くべきかについてはあまり気にすることができませんでした。それは問題ですか?

答えて

64

いいえ - 適切なタイミングで変更する限り(つまり、フィールドを削除するなど、シリアル化に影響を与える変更を行った場合)、使用する値は関係ありません。

簡単にするために、私は0から始め、必要なときに1ずつ増やすことをお勧めします。

serialization spec詳細については、

+1

申し訳ありませんJon、リンクは存在しないドキュメントを指しています(2年以上経過しています)。 –

+0

@ The Elite Gentleman:ありがとう、Oracleサーバーを指すように編集しました。 –

+1

2つの異なるクラス(MyJLabelとMyEncoderなど)が同じ値の 'serialVersionUID'を使用し、適切にデシリアライズできることを理解できますか?はい、名前が異なるので、バージョンの問題に過ぎないはずです。 – Matthieu

10

serialVersionUIDにとって重要なのは、クラスのバイナリ互換シリアル化バージョンが同じserialVersionUIDを持つことだけです。つまり、クラスのシリアライズされたフォームに大きな変更を加えなかった場合、それはうまくいくでしょう。

もちろん、より良い選択肢は、シリアライズが利用できるようにする高度なオプションを使用して、改ざんの変化がないことです。私はreadResolve()らについて読むことをお勧めします。効果的なJavaは、この分野の厄介な問題のいくつかを詳細にカバーしています。

関連する問題