が欠落している場合、Eclipse は警告を発しますserialVersionUID
。
シリアル化可能なクラスFooは、long型のstatic final serialVersionUIDフィールドを宣言していません。
それは何であり、なぜ重要なのでしょうか? 欠落すると問題が発生するserialVersionUID
例を示してください。serialVersionUID
ベストアンサー1
ドキュメントjava.io.Serializable
おそらく、これが最も良い説明になるでしょう:
シリアライゼーションランタイムは、各シリアライゼーション可能なクラスに と呼ばれるバージョン番号を関連付けます。
serialVersionUID
これは、デシリアライゼーション中に、シリアライゼーションされたオブジェクトの送信者と受信者が、そのオブジェクトのシリアライゼーションに関して互換性のあるクラスをロードしたことを確認するために使用されます。受信者が、serialVersionUID
対応する送信者のクラスとは異なる を持つオブジェクト用のクラスをロードした場合、デシリアライゼーションはInvalidClassException
シリアル化可能なクラスは、static、final、型である というserialVersionUID
名前のフィールドを宣言することで、明示的に独自の を宣言できます。serialVersionUID
long
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
シリアル化可能なクラスが を明示的に宣言しない場合
serialVersionUID
、シリアル化ランタイムは、serialVersionUID
Java(TM) オブジェクトシリアル化仕様で説明されているように、クラスのさまざまな側面に基づいてそのクラスのデフォルト値を計算します。ただし、デフォルトserialVersionUID
のserialVersionUID
計算は、コンパイラの実装によって異なる可能性のあるクラスの詳細に大きく影響され、デシリアライズ中に予期しない結果になる可能性があるため、すべてのシリアル化可能なクラスで値を明示的に宣言することを強くお勧めしますInvalidClassExceptions
。したがって、異なる Java コンパイラの実装間で一貫した値を保証するにはserialVersionUID
、シリアル化可能なクラスで明示的なserialVersionUID
値を宣言する必要があります。また、明示的な宣言では、可能な限り private 修飾子を使用することを強くお勧めします。これはserialVersionUID
、このような宣言は、直接宣言するクラスにのみ適用され、serialVersionUID
フィールドは継承されたメンバーとしては役に立たないためです。