|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
public interface Serializable
クラスの直列化可能性は、java.io.Serializable インタフェースを実装したクラスによって有効になります。このインタフェースを実装していないクラスでは、その状態が直列化または直列化復元されることはありません。直列化可能クラスのサブタイプは、すべてそれ自体が直列化可能です。直列化インタフェースにはメソッドやフィールドはなく、直列化可能であることを識別するためだけに機能します。
非直列化可能クラスのサブタイプを直列化可能にするため、サブタイプでは、スーパータイプの public フィールド、protected フィールド、および (アクセス可能であれば) package フィールドの状態を保存したり復元したりする責任を想定できます。ただし、サブタイプでこの責任を想定できるのは、それが拡張するクラスに、クラスの状態を初期化するためのアクセス可能な引数なしのコンストラクタがある場合だけです。コンストラクタがない場合は、Serializable クラスを宣言するとエラーになります。エラーは実行時に検出されます。
直列化復元の際は、非直列化可能クラスのフィールドは、そのクラスの public または protected の引数なしのコンストラクタを使って初期化されます。引数なしのコンストラクタは、直列化可能サブクラスからアクセス可能でなければなりません。直列化可能サブクラスのフィールドは、ストリームから復元されます。
オブジェクトグラフの巡回中に、直列化可能インタフェースをサポートしていない可能性のあるオブジェクトに遭遇することがあります。この場合は、NotSerializableException がスローされ、非直列化可能オブジェクトのクラスを識別します。
直列化と直列化復元の際に特殊な扱いが必要なクラスでは、正確に次のようなシグニチャーを持つ特殊なメソッドを実装する必要があります。
private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
writeObject メソッドでは、その個々のクラスのオブジェクトの状態を書き込む責任があり、対応する readObject メソッドで復元できるようになります。out.defaultWriteObject を呼び出せば、オブジェクトのフィールドを保存するためのデフォルトの機構を呼び出すことができます。そのメソッド自身は、そのスーパークラスまたはサブクラスに属する状態に関与する必要はありません。状態を保存するには、writeObject メソッドを使って個々のフィールドを ObjectOutputStream に書き込むか、または DataOutput でサポートする単純なデータタイプ用のメソッドを使います。
readObject メソッドは、ストリームから読み込んでクラスのフィールドを復元する責任があります。in.defaultReadObject メソッドを呼び出して、そのオブジェクトの非 static フィールドおよび非 transient フィールドを復元するためのデフォルトの機構を呼び出すことができます。defaultReadObject メソッドは、ストリームの情報を使い、現在のオブジェクト内の対応する名前が付けられたフィールドで、ストリームに保存されたオブジェクトのフィールドを指定します。このメソッドは、新しいフィールドを追加するためにクラスが展開される場合を扱います。このメソッド自身は、そのスーパークラスまたはサブクラスに属する状態にそれ自身が関与する必要はありません。状態は、writeObject メソッドを使って個々のフィールドを ObjectOutputStream に書き込むか、または DataOutput でサポートする基本データ型用のメソッドを使うことにより保存します。
ストリームにオブジェクトを書き込むときに使う代替オブジェクトを指定する必要がある直列化可能クラスでは、次のシグニチャーを正確に指定して、この特別なメソッドを実装する必要があります。
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
この writeReplace メソッドが存在する場合は、直列化でこのメソッドが呼び出されます。また、このメソッドは直列化されるオブジェクトのクラス内で定義されているメソッドからアクセスできます。そのため、このメソッドでは、private、protected、および package-private でアクセスすることができます。このメソッドに対するサブクラスのアクセスについては、java のアクセス可能性規則に準拠します。
代替オブジェクトのインスタンスをストリームから読み込むときにそのオブジェクトを指定する必要のあるクラスでは、次のシグニチャーを正確に指定して、この特別なメソッドを実装する必要があります。
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
この readResolve メソッドは、writeReplace と同じ呼び出し規則とアクセス可能性規則に準拠します。
直列化ランタイムは、直列化可能クラスとバージョン番号 (serialVersionUID) を関連付けます。バージョン番号は、直列化復元時に、直列化オブジェクトの送信側と受信側が直列化互換性のあるこのオブジェクトのクラスをロードしたかどうかを検証するために使用されます。受信側が送信側のクラスと serialVersionUID の異なるオブジェクトのクラスをロードした場合、直列化復元の結果は InvalidClassException
になります。直列化可能クラスは、独自の serialVersionUID を明示的に宣言できます。このためには、static かつ final の long
型フィールド「serialVersionUID
」を宣言します。
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;直列化可能クラスが明示的に serialVersionUID を宣言しない場合、直列化ランタイムは、『Java(TM) Object Serialization Specification』に記述されているように、さまざまな局面に基づいて、そのクラスのデフォルトの serialVersionUID 値を計算します。しかし、デフォルトの serialVersionUID の計算は、クラスの詳細情報に大きく左右され、このクラスの詳細情報はさらに、コンパイラの実装状況に依存しているので、直列化復元時に予期しない
InvalidClassException
が発生する可能性があります。このような問題を防ぐためにも、すべての直列化可能クラスが serialVersionUID 値を明示的に宣言するように設定することを強くお勧めします。Java コンパイラ実装が異なっていても、常に一定の serialVersionUID 値を得るには、直列化可能クラスが明示的な serialVersionUID 値を宣言する必要があります。また、この宣言では、できるかぎり private
修飾子を使用することをお勧めします。なぜなら、この宣言は直近の宣言クラスにしか適用されず、serialVersionUID フィールドは継承メンバとして使用できないからです。
ObjectOutputStream
,
ObjectInputStream
,
ObjectOutput
,
ObjectInput
,
Externalizable
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。