なぜserialVersionUID
Javaクラスで宣言するのですか? 通常のJava クラスserialVersionUID
での宣言の使用は何ですか。
class Simple
{
public static final long serialVersionUID=1L;
}
なぜserialVersionUID
Javaクラスで宣言するのですか? 通常のJava クラスserialVersionUID
での宣言の使用は何ですか。
class Simple
{
public static final long serialVersionUID=1L;
}
Java は、オブジェクトのデータだけでなく、オブジェクトのタイプとオブジェクトに格納されているデータのタイプに関する情報を含むバイトのシーケンスとしてオブジェクトを表すことができる、オブジェクトのシリアライゼーションと呼ばれるメカニズムを提供します。
シリアル化されたオブジェクトがファイルに書き込まれた後、そのオブジェクトをファイルから読み取って逆シリアル化できます。つまり、オブジェクトとそのデータを表す型情報とバイトを使用して、メモリ内にオブジェクトを再作成できます。
java.io.Serializable のドキュメントよりも優れた説明は得られません。
シリアル化ランタイムは、シリアル化可能な各クラスに、serialVersionUID と呼ばれるバージョン番号を関連付けます。これは、シリアル化されたオブジェクトの送信者と受信者が、シリアル化に関して互換性のあるそのオブジェクトのクラスを読み込んだことを確認するために、逆シリアル化中に使用されます。受信者が、対応する送信者のクラスとは異なる serialVersionUID を持つオブジェクトのクラスをロードした場合、逆シリアル化により InvalidClassException が発生します。シリアル化可能なクラスは、「serialVersionUID」という名前のフィールドを宣言することによって、独自の serialVersionUID を明示的に宣言できます。このフィールドは、静的で、最終的で、long 型でなければなりません。
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
シリアライズ可能なクラスが serialVersionUID を明示的に宣言しない場合、シリアライゼーション ランタイムは、Java(TM) オブジェクト シリアライゼーション仕様で説明されているように、クラスのさまざまな側面に基づいて、そのクラスのデフォルトの serialVersionUID 値を計算します。ただし、デフォルトの serialVersionUID 計算は、コンパイラの実装によって異なる可能性があるクラスの詳細に非常に敏感であり、逆シリアル化中に予期しない InvalidClassExceptions が発生する可能性があるため、すべてのシリアル化可能なクラスで serialVersionUID 値を明示的に宣言することを強くお勧めします。したがって、異なる Java コンパイラの実装間で一貫した serialVersionUID 値を保証するには、シリアライズ可能なクラスで明示的な serialVersionUID 値を宣言する必要があります。
serialVersionUID is for Serialization Purpose.
private static final long serialVersionUID = 1L;
serialVersionUID がないと、SerialzationException が発生することがありました。java.io.Serializableを参照