目次 | 前の項目 | 次の項目 Java オブジェクト直列化仕様


4.6 ストリーム固有識別子

バージョン管理された各クラスでは、オリジナルクラスバージョンを指定する必要があり、それによってストリームの書き込み、読み込みが可能になります。たとえば、バージョン管理されたクラスは、次のように宣言する必要があります。

    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) の指定によって定義されます。

ストリームにおける項目の順序は次のとおりです。

  1. UTF エンコーディングを使って書かれたクラス名
  2. 32 ビット整数として書かれたクラス修飾子
  3. UTF エンコーディングで書かれた名前によってソートされた各インタフェース名
  4. フィールド名でソートされたクラスの各フィールドの場合 (private static と private transient のフィールドを除く)
    1. UTF エンコーディングによるフィールド名
    2. 32 ビット整数として書かれたフィールドの修飾子
    3. UTF エンコーディングによるフィールドの記述子
  5. クラス初期化子が存在する場合は、以下を書き出してください。
    1. UTF エンコーディングによるメソッド名 <clinit>
    2. 32 ビット整数として書かれたメソッドの修飾子 java.lang.reflect.Modifier.STATIC
    3. UTF エンコーディングによるメソッドの記述子 ()V
  6. メソッド名とシグニチャーでソートされた private でない各コンストラクタの場合
    1. UTF エンコーディングによるメソッド名 <init>
    2. 32 ビット整数として書かれたメソッドの修飾子
    3. UTF エンコーディングによるメソッドの記述子
  7. メソッド名とシグニチャーでソートされた private でない各メソッドの場合
    1. UTF エンコーディングによるメソッド名
    2. 32 ビット整数として書かれたメソッドの修飾子
    3. UTF エンコーディングによるメソッドの記述子
  8. SHA-1 アルゴリズムは、DataOutputStream によって作成されたバイトストリームに対して実行され、5 つの 32 ビット値からなる sha[0..4] を作成します。
  9. ハッシュ値は、SHA-1 メッセージダイジェストの 1 つ目と 2 つ目の 32 ビット値で組み立てられます。メッセージダイジェストの結果が、5 つの 32 ビット文字 H0 H1 H2 H3 H4 からなる 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;


目次 | 前の項目 | 次の項目
Copyright © 1997-2001 Sun Microsystems, Inc. All Rights Reserved.