目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
オブジェクトの直列化を行うと、保管しようとするオブジェクトの JavaTM クラスに関する情報を持つストリームが作成されます。Serializable オブジェクトの場合、そのクラスの異なる (しかし互換性のある) バージョンの実装が存在していても、これらのオブジェクトを復元するのに十分な情報が保持されます。Serializable
インタフェースは、直列化可能プロトコルを実装するクラスを識別するように定義されます。package java.io; public interface Serializable {};Serializable クラスの要件は以下のとおりです。
serialPersistentFields
メンバを使ってフィールドを明示的に直列化可能と宣言するか、transient キーワードを使って非直列化可能フィールドを指定する)
Serializable クラスは、オプションで次のメソッドを定義できます。
ObjectOutputStream
およびObjectInputStream
を使用すると、操作対象の直列化可能クラスを展開 (以前のバージョンのクラスとの互換性を持つクラスへの変更が可能) できます。互換性を保つ変更に使用できる機構についての詳細は、「5.5 互換性のある JavaTM の型展開」を参照してください。
注 - ローカルクラスおよび匿名クラスを含む内部クラス (static メンバクラスではない入れ子のクラス) の直列化は、いくつかの理由により、使用しないことを強くお勧めします。非 static コンテキストで宣言された内部クラスには、囲むクラスインスタンスへの暗黙的な非 transient 参照が含まれるので、そのような内部クラスインスタンスを直列化すると、関連する外部クラスインスタンスも直列化されることになります。内部クラスを実装するjavac
(またはその他の JavaTM コンパイラ) によって生成された合成フィールドは、実装に依存するので、コンパイラによって相違が生じることがあります。そのようなフィールドの相違により、デフォルトのserialVersionUID
の値が矛盾するだけでなく、互換性が損なわれる可能性があります。ローカルおよび匿名の内部クラスに割り当てられる名前も実装に依存するので、コンパイラによって相違が生じる可能性があります。内部クラスは、コンパイル時定数フィールド以外の static メンバを宣言できないので、serialPersistentFields
機構を使って直列化可能フィールドを指定することはできません。さらに、外部インスタンスに関連付けられた内部クラスは、引数なしのコンストラクタ (そのような内部クラスのコンストラクタは、囲むクラスを付加パラメータとして暗黙的に受け入れる) を持たないため、Externalizable
を実装することはできません。ただし、上記の問題はいずれも、static メンバクラスには当てはまりません。