目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
バージョン管理された各クラスでは、オリジナルクラスバージョンを指定する必要があり、それによってストリームの書き込み、読み込みが可能になります。たとえば、バージョン管理されたクラスは、次のように宣言する必要があります。private static final long serialVersionUID = 3487495895819393L;ストリーム固有識別子は、クラス名、インタフェースクラス名、メソッド、フィールドをハッシュした 64 ビットの値です。最初のバージョンを除くクラスのすべてのバージョンで、この値を宣言する必要があります。この値は、オリジナルクラスに宣言することもできますが、必須ではありません。互換性のあるすべてのクラスで、この値は一定です。クラスに対してこの SUID を宣言しないと、この値はそのクラスのハッシュになります。Serializable
クラスではバージョン管理を考慮する必要はありませんが、Externalizable
クラスではその必要があります。
注 - 内部クラスである直列化可能クラス、または内部クラスを持つ直列化可能クラスが serialVersionUID データメンバを宣言することを、強くお勧めします。これは、コンパイラの実装が異なる場合、内部クラスの実装のために生成される合成メンバに異なる名前を付けることができ、これらの名前が SUID の現在の計算に使用されるためです。
Externalizable
クラスの初期バージョンでは、将来的に拡張可能なストリームデータ形式を出力する必要があります。readExternal
メソッドの初期バージョンは、writeExternal
メソッドの将来のすべてのバージョンの出力形式を読み取り可能でなければなりません。
serialVersionUID
は、そのクラス定義を反映したバイトストリームのシグニチャーを使って計算されます。ストリームのシグニチャーの計算には、米国国立標準技術研究所 (NIST) の Secure Hash Algorithm (SHA-1) が使用されます。64 ビットハッシュには、最初の 2 つの 32 ビットが使われます。プリミティブデータ型からバイト列への変換には、java.lang.DataOutputStream
が使用されます。このストリームへ入力される値は、クラスに対する JavaTM 仮想マシン(VM) の指定によって定義されます。
<clinit>
()V
sha
という名前の 5 つの整数値である場合、ハッシュ値は次のように計算されます。 long hash = ((sha[0] >>> 24) & 0xFF) | ((sha[0] >>> 16) & 0xFF) << 8 | ((sha[0] >>> 8) & 0xFF) << 16 | ((sha[0] >>> 0) & 0xFF) << 24 | ((sha[1] >>> 24) & 0xFF) << 32 | ((sha[1] >>> 16) & 0xFF) << 40 | ((sha[1] >>> 8) & 0xFF) << 48 | ((sha[1] >>> 0) & 0xFF) << 56;