全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス

インタフェース java.io.Serializable

public interface Serializable
クラスの直列化可能性は、 java.io.Serializable インタフェースを実装したクラスによって有効になります。 このインタフェースを実装していないクラスでは、その状態が直列化または直列化復元されることはありません。 直列化可能なクラスのサブタイプは、すべてそれ自体が直列化可能です。 直列化インタフェースにはメソッドやフィールドはなく、直列化可能な意味を識別するためだけに機能します。

直列化不可能なクラスのサブタイプを直列化可能にするため、サブタイプでは、スーパータイプのパブリックフィールド、保護フィールド、および(アクセス可能なら)パッケージフィールドの状態を保存したり復元したりする責任を想定できます。 ただし、サブタイプでこの責任を想定できるのは、それが拡張するクラスに、クラスの状態を初期化するためのアクセス可能な引数無しの構築子がある場合だけです。 この場合、 Serializable クラスを宣言するとエラーになります。エラーは実行時に検出されます。

直列化復元中、直列化不可能なクラスのフィールドは、 そのクラスのパブリックのまたは保護された引数無しの構築子を使って初期化されます。 引数無しの構築子は、直列化可能なサブクラスからアクセス可能でなければなりません。直列化可能なサブクラスのフィールドは、ストリームから復元されます。

グラフをトラバースしていると、直列化可能なインタフェースをサポートしていない可能性のあるオブジェクトに出会うことがあります。 この場合は、 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 メソッドを呼び出して、そのオブジェクトの非スタティックフィールドおよび非トランジェントフィールドを復元するためのデフォルトのメカニズムを呼び出すことができます。 defaultReadObject メソッドでは、ストリームの情報を使い、現在のオブジェクト内の対応する名前が付けられたフィールドで、ストリームに保存されたオブジェクトのフィールドを指定します。 このメソッドでは、新しいフィールドにクラスが呼び出された場合を扱います。 このメソッドでは、そのスーパークラスまたはサブクラスに属する状態でそれ自体を確認する必要はありません。 状態は、writeObject メソッドを使って個々のフィールドを ObjectOutputStream に書き込むか、または DataOutput でサポートする単純なデータタイプ用メソッドを使って保存します。

参照:
ObjectOutputStream, ObjectInputStream, ObjectOutput, ObjectInput, Externalizable


全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス