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


4.4 ストリーム固有識別子

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

    private static final long serialVersionUID = 3487495895819393L;
ストリーム固有識別子は、クラス名、インタフェースクラス名、メソッド、フィールドをハッシュした 64 ビットの値です。最初のバージョンを除くクラスのすべてのバージョンで、この値を宣言する必要があります。この値は、オリジナルクラスに宣言することもできますが、必須ではありません。互換性のあるすべてのクラスで、この値は一定です。クラスに対してこの SUID を宣言しないと、この値はそのクラスのハッシュになります。Serializable クラスではバージョン管理を考慮する必要はありませんが、Externalizable クラスではその必要があります。Externalizable クラスの初期バージョンでは、将来的に拡張可能なストリームデータ形式を出力する必要があります。readExternal メソッドの初期バージョンは、writeExternal メソッドの将来のすべてのバージョンの出力形式を読み取り可能でなければなりません。

serialVersionUID は、そのクラス定義を反映したバイトストリームのシグニチャーを使って計算されます。ストリームのシグニチャーの計算には、米国連邦情報技術局 (NIST) の Secure Hash Algorithm (SHA-1) が使用されます。64 ビットハッシュには、最初の 2 つの 32 ビットが使われます。プリミティブデータ型からバイト列への変換には、java.lang.DataOutputStream が使用されます。このストリームへ入力される値は、クラスに対する JavaTM Virtual Machine (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. ハッシュ値は、最初とその次の 32 ビット値から作られます。 long hash = sha[1] << 32 + sha[0]


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