Serializable
InterfaceRevised: 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
インタフェースを実装したクラスから作られるオブジェクトの直列化では、直列化の制御方法を明示的に指示します。