Serializable Interface

Revised: Mar./23rd/2002

全てのオブジェクトが直列化できるわけではありません。

java.io.Serializable インタフェースを実装 (implements) したクラスをインスタンス化して作られたオブジェクトが直列化できます。また、直列化可能なクラスのサブクラスも直列化可能です。

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

Serializable インタフェースにはメソッドやフィールドはなく、直列化可能であることを識別するためだけに機能します。このインタフェースは、当該クラスのオブジェクトが直列化可能であることを識別する為だけに存在します。このように、定義が空のインタフェースを、マーカー・インタフェース (marker interface) と呼びます。

Serializable の定義:

package java.io;

public interface Serializable {};

定義が空なので、実装すると言っても、クラス宣言に "implements java.io.Serializable" と記述するだけです。

java.lang.Object クラスはこのインタフェースを実装していません。したがって、自分で定義したクラスを直列化可能にする為には、明示的に Serializable インタフェースを実装 (implements) するか、直列化可能なクラスを継承 (extends) して作る必要があります。

// Serializable インタフェースを実装
class IoObj implements java.io.Serializable {}

// 直列化可能なクラスを継承
class IoObj2 extends IoObj {}

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

Serializable インタフェースを継承したインタフェースで、 Externalizable インタフェースと言うものがあります。このインタフェースを実装したクラスから作られたオブジェクトも直列化可能です。

このインタフェースを実装したクラスの直列化は、自動的には処理されません。直列化プロセスの制御を明示的に指定することが出来ます。オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。自動的に行われるのは、オブジェクトの参照の保存だけです。

Externalizable の定義:

package java.io;

public interface Externalizable extends Serializable {
    public void writeExternal(ObjectOutput out) throws IOException;
    public void readExternal(ObjectInput in) throws IOException,
                             java.lang.ClassNotFoundException;
}

このインタフェースの内容は空ではないので、宣言されている二つのメソッドを実装する必要があります。

Serializable クラス
Sreializable インタフェースを実装したクラスから作られるオブジェクトの直列化では、オブジェクトの各クラスのフィールドが自動的に保存/復元され、関連するデータ/定義も全て自動的に処理されます。
Externalizable クラス
Externalizable インタフェースを実装したクラスから作られるオブジェクトの直列化では、直列化の制御方法を明示的に指示します。


Copyright © 2002 SUGAI, Manabu. All Rights Reserved.