serialVersionUIDとは何ですか?なぜそれを使う必要があるのですか?質問する

serialVersionUIDとは何ですか?なぜそれを使う必要があるのですか?質問する

が欠落している場合、Eclipse は警告を発しますserialVersionUID

シリアル化可能なクラスFooは、long型のstatic final serialVersionUIDフィールドを宣言していません。

それは何であり、なぜ重要なのでしょうか? 欠落すると問題が発生するserialVersionUID例を示してください。serialVersionUID

ベストアンサー1

ドキュメントjava.io.Serializableおそらく、これが最も良い説明になるでしょう:

シリアライゼーションランタイムは、各シリアライゼーション可能なクラスに と呼ばれるバージョン番号を関連付けます。serialVersionUIDこれは、デシリアライゼーション中に、シリアライゼーションされたオブジェクトの送信者と受信者が、そのオブジェクトのシリアライゼーションに関して互換性のあるクラスをロードしたことを確認するために使用されます。受信者が、serialVersionUID対応する送信者のクラスとは異なる を持つオブジェクト用のクラスをロードした場合、デシリアライゼーションはInvalidClassExceptionシリアル化可能なクラスは、static、final、型である というserialVersionUID名前のフィールドを宣言することで、明示的に独自の を宣言できますserialVersionUIDlong

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

シリアル化可能なクラスが を明示的に宣言しない場合serialVersionUID、シリアル化ランタイムは、serialVersionUIDJava(TM) オブジェクトシリアル化仕様で説明されているように、クラスのさまざまな側面に基づいてそのクラスのデフォルト値を計算します。ただし、デフォルトserialVersionUIDserialVersionUID計算は、コンパイラの実装によって異なる可能性のあるクラスの詳細に大きく影響され、デシリアライズ中に予期しない結果になる可能性があるため、すべてのシリアル化可能なクラスで値を明示的に宣言することを強くお勧めしますInvalidClassExceptions。したがって、異なる Java コンパイラの実装間で一貫した値を保証するにはserialVersionUID、シリアル化可能なクラスで明示的なserialVersionUID値を宣言する必要があります。また、明示的な宣言では、可能な限り private 修飾子を使用することを強くお勧めします。これはserialVersionUID、このような宣言は、直接宣言するクラスにのみ適用され、serialVersionUIDフィールドは継承されたメンバーとしては役に立たないためです。

おすすめ記事