|
CDC 1.1.2 | |||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
public interface Serializable
クラスの直列化可能性は、java.io.Serializable インタフェースを実装するクラスによって有効になります。このインタフェースを実装していないクラスでは、その状態が直列化または直列化復元されることはありません。直列化可能クラスのサブタイプは、すべてそれ自体が直列化可能です。直列化インタフェースはメソッドまたはフィールドがなく、直列化可能であるという意味を識別する機能だけを備えています。
非直列化可能クラスのサブタイプを直列化可能にするために、スーパータイプの public フィールド、protected フィールド、およびアクセス可能な場合は package フィールドの状態を保存および復元する役割をサブタイプが担うことができます。ただし、サブタイプがこの役割を担うことができるのは、サブタイプによって拡張されるクラスに、クラスの状態を初期化するための引数なしのアクセス可能なコンストラクタがある場合だけです。そうでない場合に直列化可能クラスを宣言するとエラーになります。エラーは実行時に検出されます。
直列化復元の際は、非直列化可能クラスのフィールドは、そのクラスの 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 と同じ呼び出し規則とアクセス可能性規則に準拠します。
ObjectOutputStream
,
ObjectInputStream
,
ObjectOutput
,
ObjectInput
,
Externalizable
|
CDC 1.1.2 | |||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |