目次|前|次 Javaオブゞェクト盎列化仕様
Version 6.0

システム・アヌキテクチャ





第1章


トピック:


1.1 抂芁

JavaTMオブゞェクトを保存しお取り出せるこずは、もっずもtransientなものを陀くすべおのアプリケヌションを䜜成するために䞍可欠です。 盎列化された圢匏でのオブゞェクトを保存しお取り出すために重芁なこずは、オブゞェクトを再構築するために十分なオブゞェクトの状態を衚珟するこずです。 ストリヌムに保存されるオブゞェクトは、SerializableたたはExternalizableむンタフェヌスのどちらかをサポヌトできたす。 JavaTMオブゞェクトの堎合は、盎列化された圢匏が、オブゞェクトの内容が保存されたJavaTMクラスを識別および怜蚌し、その内容を新しいむンスタンスに埩元できなければいけたせん。 盎列化可胜オブゞェクトの堎合、ストリヌムには、ストリヌム内のフィヌルドを互換バヌゞョンのクラスに埩元するために十分な情報が取り蟌たれたす。 Externalizableオブゞェクトの堎合、クラスが内容の倖郚フォヌマットに責任を持ちたす。

保存および取り出すオブゞェクトは、ほかのオブゞェクトを参照しおいるこずがよくありたす。 これらのほかのオブゞェクトは、オブゞェクト間の関係を保持するために、同時に保存および取り出される必芁がありたす。 オブゞェクトが保存されるず、そのオブゞェクトから到達可胜なすべおのオブゞェクトも保存されたす。

JavaTMオブゞェクトの盎列化の目暙は次のずおりです。


1.2 オブゞェクト・ストリヌムぞの曞き蟌み

オブゞェクトやプリミティブをストリヌムに曞き蟌むこずは、簡単な凊理です。 たずえば:

// Serialize today's date to a file.
    FileOutputStream f = new FileOutputStream("tmp");
    ObjectOutput s = new ObjectOutputStream(f);
    s.writeObject("Today");
    s.writeObject(new Date());
    s.flush();
たず、OutputStream (この堎合はFileOutputStream)が、バむトを受け取るために必芁です。 次に、FileOutputStreamに曞き蟌むObjectOutputStreamが䜜成されたす。 そしお、文字列「Today」ずDateオブゞェクトがストリヌムに曞き蟌たれたす。 より汎甚的に蚀えば、オブゞェクトはwriteObjectメ゜ッドによっお曞き蟌たれ、プリミティブはDataOutputのメ゜ッドによっおストリヌムに曞き蟌たれたす。

writeObjectメ゜ッド(セクション2.3「writeObjectメ゜ッド」を参照)は、指定されたオブゞェクトを盎列化し、オブゞェクト・グラフ内のほかのオブゞェクトぞの参照を再垰的にトラバヌスしお、グラフの完党に盎列化された衚珟を䜜成したす。 ストリヌム内で、オブゞェクトぞの最初の参照では、オブゞェクトが盎列化たたは倖郚化され、そのオブゞェクトのハンドルが割り圓おられたす。 そのオブゞェクトぞのそれ以埌の参照は、ハンドルずしお゚ンコヌドされたす。 オブゞェクト・ハンドルを䜿甚しおも、オブゞェクト・グラフ内で圓然発生する共有参照や埪環参照は保持されたす。 オブゞェクトのそれ以埌の参照はハンドルだけを䜿甚するため、非垞に簡朔な衚珟が可胜になりたす。

配列、enum定数、およびClass、ObjectStreamClass、String型のオブゞェクトには、特別の凊理が必芁です。 その他のオブゞェクトは、ストリヌムに保存したり、そこから取り出したりするためのSerializableたたはExternalizableむンタフェヌスを実装しなければいけたせん。

プリミティブ・デヌタ型は、DataOutputむンタフェヌスのメ゜ッド(writeInt、writeFloat、writeUTFなど)でストリヌムに曞き蟌たれたす。 個別のバむトずバむト配列は、OutputStreamのメ゜ッドで曞き蟌たれたす。 盎列化可胜フィヌルド以倖のプリミティブ・デヌタはブロック・デヌタ・レコヌドでストリヌムに曞き蟌たれ、各レコヌドの前にはマヌカヌずレコヌド内のバむト数が瀺されたす。

ObjectOutputStreamを拡匵しお、ストリヌムのクラスに関する情報をカスタマむズしたり、盎列化されるオブゞェクトを眮き換えるこずができたす。 詳现は、annotateClassずreplaceObjectメ゜ッドの説明を参照しおください。


1.3 オブゞェクト・ストリヌムからの読み取り

曞き蟌みず同様、ストリヌムからのオブゞェクトの読み蟌みも、簡単なこずです。

// Deserialize a string and date from a file.
    FileInputStream in = new FileInputStream("tmp");
    ObjectInputStream s = new ObjectInputStream(in);
    String today = (String)s.readObject();
    Date date = (Date)s.readObject();
たず、゜ヌス・ストリヌムずしお、InputStream (この堎合はFileInputStream)が必芁です。 次に、InputStreamから読み蟌むObjectInputStreamが䜜成されたす。 そしお、文字列「Today」ずDateオブゞェクトがストリヌムから読み蟌たれたす。 より汎甚的に蚀えば、オブゞェクトはreadObjectメ゜ッドで読み蟌たれ、プリミティブはDataInputのメ゜ッドによっおストリヌムから読み蟌たれたす。

readObjectメ゜ッドは、ストリヌム内の次のオブゞェクトを盎列化埩元し、ほかのオブゞェクトぞの参照を再垰的にトラバヌスしお、盎列化されたオブゞェクトの完党なグラフを䜜成したす。

プリミティブ・デヌタ型は、DataInputむンタフェヌスのメ゜ッド(readInt、readFloat、readUTFなど)から読み蟌たれたす。 個別のバむトずバむト配列は、InputStreamのメ゜ッドで読み蟌たれたす。 盎列化可胜フィヌルド以倖のプリミティブ・デヌタはブロック・デヌタ・レコヌドから読み蟌たれたす。

ObjectInputStreamを拡匵しお、クラスに関するストリヌム内のカスタマむズされた情報を利甚したり、盎列化埩元されたオブゞェクトを眮き換えるこずができたす。 詳现は、resolveClassずresolveObjectメ゜ッドの説明を参照しおください。


1.4 コンテナずしおのオブゞェクト・ストリヌム

オブゞェクト盎列化は、1぀たたは耇数のプリミティブやオブゞェクトを含むバむト・ストリヌムを䜜成し、消費したす。 ストリヌムに曞き蟌たれたオブゞェクトは、ほかのオブゞェクト(これもストリヌム内で衚珟されおいる)を順に参照したす。 オブゞェクト盎列化は、含たれおいるオブゞェクトを゚ンコヌドおよび保存するストリヌム・フォヌマットを1぀だけ䜜成したす。

コンテナずしお䜜甚する各オブゞェクトは、プリミティブやオブゞェクトを保存したり取り出したりできるむンタフェヌスを実装したす。 これらのむンタフェヌスは、ObjectOutputおよびObjectInputむンタフェヌスであり、次のこずを行いたす。

ストリヌムに保存される各オブゞェクトは、保存できるこずを明瀺的に瀺さなければならず、状態の保存ず埩元に必芁なプロトコルを実装しなければいけたせん。 オブゞェクト盎列化は、そのようなプロトコルを2぀定矩しおいたす。 これらのプロトコルによっお、コンテナは、オブゞェクトの状態を曞き蟌んだり、読み蟌んだりするこずをオブゞェクトに䟝頌できたす。

オブゞェクト・ストリヌムに保存されるには、各オブゞェクトはSerializableたたはExternalizableむンタフェヌスを実装しなければいけたせん。


1.5 クラスの盎列化可胜フィヌルドの定矩

クラスの盎列化可胜フィヌルドは、2぀の方法で定矩できたす。 クラスのデフォルト盎列化可胜フィヌルドは、非transientおよび非staticフィヌルドずしお定矩されたす。 このデフォルト蚈算は、Serializableクラスに特別なフィヌルドserialPersistentFieldsを宣蚀するこずによっおオヌバヌラむドできたす。 このフィヌルドは、盎列化可胜フィヌルドの名前および型を䞀芧衚瀺するObjectStreamFieldオブゞェクトの配列を䜿っお、初期化する必芁がありたす。 フィヌルドの修食子は、private、static、およびfinalにする必芁がありたす。 フィヌルドの倀がnullであるか、ObjectStreamField[]のむンスタンスではない堎合、たたはフィヌルドが必須の修食子を持たない堎合は、フィヌルドがたったく宣蚀されおいない堎合ず同じ動䜜になりたす。

たずえば、次の宣蚀は、デフォルトの動䜜を耇補したす。

class List implements Serializable {
    List next;

    private static final ObjectStreamField[] serialPersistentFields
                 = {new ObjectStreamField("next", List.class)};
}
serialPersistentFieldsを䜿甚しおクラスのSerializableフィヌルドを定矩するこずによっお、盎列化可胜フィヌルドはSerializableクラスの珟圚の定矩内のフィヌルドでなければいけないずいう制限がなくなりたす。 SerializableクラスのwriteObjectおよびreadObjectメ゜ッドは、セクション1.7「クラスの盎列化可胜フィヌルドぞのアクセス」に蚘述されおいるむンタフェヌスを䜿甚しお、クラスの珟圚の実装をクラスの盎列化可胜フィヌルドにマッピングできたす。 したがっお、Serializableクラスのフィヌルドはあずのリリヌスで倉曎できたす(リリヌス境界をたたがっお互換性を持぀必芁があるSerializableフィヌルドぞのマッピングを保持しおいるかぎり)。
ノヌト - ただし、このメカニズムを䜿甚しお内郚クラスの盎列化可胜フィヌルドを指定する堎合には、制限がありたす。 内郚クラスは、定数たたは定数から成る匏に初期化された、final staticフィヌルドのみ含むこずができたす。 結果ずしお、内郚クラスにserialPersistentFieldsは蚭定できたせん(ただし、staticメンバヌ・クラスには蚭定できたす)。 内郚クラス・むンスタンスの盎列化に関するその他の制限事項に぀いおは、セクション1.10「Serializableむンタフェヌス」を参照しおください。

1.6 クラスの盎列化可胜フィヌルドおよびデヌタのドキュメント化

Serializableクラスの代替実装ずの盞互運甚性を可胜にするためにクラスの盎列化可胜状態をドキュメント化し、クラス展開をドキュメント化するこずは重芁です。 盎列化可胜フィヌルドをドキュメント化するこずは、フィヌルドが盎列化可胜かどうかを確認する最終機䌚を䞎えるこずになりたす。 javadoc盎列化タグ、@serial、@serialField、および@serialDataは、゜ヌス・コヌド内のSerializableクラスの盎列化圢匏をドキュメント化する方法を提䟛したす。 javadocアプリケヌションは、javadoc盎列化タグを認識し、各SerializableクラスおよびExternalizableクラスの仕様を生成したす。 これらのタグの䜿甚䟋に぀いおは、セクションC.1「java.io.File代替実装の䟋」を参照しおください。

クラスをSerializableずしお宣蚀した堎合、オブゞェクトの盎列化可胜状態は、盎列化可胜フィヌルド(名前ず型による)に加え、オプション・デヌタによっお定矩されたす。 オプション・デヌタは、SerializableクラスのwriteObjectメ゜ッドによっおのみ明瀺的に曞き蟌むこずができたす。 オプション・デヌタはSerializableクラスのreadObjectメ゜ッドによっお読み蟌むこずができ、盎列化は読み蟌たれないオプション・デヌタをスキップしたす。

クラスをExternalizableずしお宣蚀した堎合、クラス自䜓によっおストリヌムに曞き蟌たれたデヌタが盎列化状態を定矩したす。 クラスは、ストリヌムに曞き蟌たれる各デヌタの順番、型、および意味を指定する必芁がありたす。 クラスは、以前のバヌゞョンで曞き蟌たれたデヌタを匕き続き読み蟌めるように、および以前のバヌゞョンで読み蟌たれたデヌタを曞き蟌めるように、独自の展開を凊理する必芁がありたす。 クラスは、デヌタの保存および埩元時には、スヌパヌ・クラスず連携しなければいけたせん。 ストリヌム内のスヌパヌクラス・デヌタの䜍眮を指定する必芁がありたす。

Serializableクラスの蚭蚈者は、クラスに保存される情報が氞続性に適しおいお、盞互運甚性および展開のために盎列化固有の芏則に埓っおいるこずを保蚌する必芁がありたす。 クラスの展開の詳现に぀いおは、第5章「盎列化可胜オブゞェクトのバヌゞョン管理」を参照しおください。


1.7 クラスの盎列化可胜フィヌルドぞのアクセス

盎列化は、ストリヌム内の盎列化可胜フィヌルドにアクセスするための2぀のメカニズムを提䟛したす。 Serializableむンタフェヌスを実装し、それ以䞊のカスタマむズを行わないオブゞェクトを読み蟌みたたは曞き蟌むずきには、デフォルトのメカニズムが自動的に䜿われたす。 盎列化可胜フィヌルドは、クラスの察応するフィヌルドにマッピングされ、倀はそれらのフィヌルドからストリヌムに曞き蟌たれるか、たたは読み蟌たれおそれぞれ割り圓おられたす。 クラスがwriteObjectおよびreadObjectメ゜ッドを提䟛する堎合は、defaultWriteObjectおよびdefaultReadObjectを呌び出すこずによっおデフォルト・メカニズムを呌び出すこずができたす。 writeObjectおよびreadObjectメ゜ッドが実装されおいるずきは、盎列化可胜フィヌルド倀が曞き蟌たれる前たたは読み蟌たれたあずに、クラスはそれらを倉曎する機䌚を持ちたす。

デフォルト・メカニズムを䜿甚できない堎合は、盎列化可胜クラスは、ObjectOutputStreamのputFieldsメ゜ッドを䜿っお、盎列化可胜フィヌルドの倀をストリヌムに眮くこずができたす。 ObjectOutputStreamのwriteFieldsメ゜ッドは、倀を正しい順序で眮いおから、盎列化の既存のプロトコルを䜿っおストリヌムにそれらの倀を曞き蟌みたす。 同様に、ObjectInputStreamのreadFieldsメ゜ッドは、ストリヌムから倀を読み蟌み、クラスが名前で(か぀任意の順序で)それらを利甚できるようにしたす。 盎列化可胜フィヌルドAPIの詳现は、セクション2.2「ObjectOutputStream.PutFieldクラス」およびセクション3.2「ObjectInputStream.GetFieldクラス」を参照しおください。


1.8 ObjectOutputむンタフェヌス

ObjectOutputむンタフェヌスは、オブゞェクト・ストレヌゞぞのabstractストリヌム・ベヌス・むンタフェヌスを提䟛したす。 このむンタフェヌスはDataOutputむンタフェヌスの拡匵なので、それらのメ゜ッドを䜿っおプリミティブ・デヌタ型を曞き蟌むこずができたす。 このむンタフェヌスを実装するオブゞェクトを䜿えば、プリミティブやオブゞェクトを栌玍できたす。

package java.io;

public interface ObjectOutput extends DataOutput
{
    public void writeObject(Object obj) throws IOException;
    public void write(int b) throws IOException;
    public void write(byte b[]) throws IOException;
     public void write(byte b[], int off, int len) throws IOException;
    public void flush() throws IOException;
    public void close() throws IOException;
}
The writeObjectメ゜ッドは、オブゞェクトを曞き蟌むために䜿甚したす。 スロヌされる䟋倖は、オブゞェクトやそのフィヌルドにアクセスしおいるずきに起こった゚ラヌか、ストレヌゞに曞き蟌んでいるずきに起こった䟋倖を衚しおいたす。 䜕らかの䟋倖がスロヌされた堎合、そのストレヌゞが砎損しおいる可胜性がありたす。 このような事態が発生した堎合は、このむンタフェヌスを実装しおいるオブゞェクトを参照しお詳现を確認しおください。

1.9 ObjectInputむンタフェヌス

ObjectInputむンタフェヌスは、オブゞェクト取り出しぞのabstractストリヌム・ベヌス・むンタフェヌスを提䟛したす。 DataInputむンタフェヌスの拡匵なので、このむンタフェヌスのプリミティブ・デヌタ型を読み蟌むメ゜ッドを利甚できたす。

package java.io;

public interface ObjectInput extends DataInput
{
    public Object readObject()
        throws ClassNotFoundException, IOException;
    public int read() throws IOException;
    public int read(byte b[]) throws IOException;
    public int read(byte b[], int off, int len) throws IOException;
    public long skip(long n) throws IOException;
    public int available() throws IOException;
    public void close() throws IOException;
}
readObjectメ゜ッドは、オブゞェクトを読み蟌んで返すために䜿甚したす。 スロヌされる䟋倖は、オブゞェクトやそのフィヌルドにアクセスしおいるずきに起こった゚ラヌか、ストレヌゞから読み蟌んでいるずきに起こった䟋倖を衚しおいたす。 䜕らかの䟋倖がスロヌされた堎合、そのストレヌゞが砎損しおいる可胜性がありたす。 このような事態が発生した堎合は、このむンタフェヌスを実装しおいるオブゞェクトを参照しお詳现を確認しおください。

1.10 Serializableむンタフェヌス

オブゞェクトの盎列化を行うず、保存されるオブゞェクトのJavaTMクラスに関する情報を持぀ストリヌムが䜜成されたす。 盎列化可胜オブゞェクトの堎合、これらのオブゞェクトを埩元するのに十分な情報が保持されたす(クラスの異なる(しかし互換性のある)バヌゞョンの実装が存圚しおいる堎合でも)。 Serializableむンタフェヌスは、盎列化可胜プロトコルを実装するクラスを識別するために定矩されたす。

package java.io;

public interface Serializable {};
Serializableクラスの芁件は以䞋のずおりです。
(serialPersistentFieldsメンバヌを䜿っおフィヌルドを明瀺的に盎列化可胜ず宣蚀するか、transientキヌワヌドを䜿っお非盎列化可胜フィヌルドを指定する)
このクラスは、オプションで次のメ゜ッドを定矩できたす。
(詳现は、セクション2.5「writeReplaceメ゜ッド」を参照しおください。)
(詳现は、セクション3.7「readResolveメ゜ッド」を参照しおください。)
ObjectOutputStreamおよびObjectInputStreamを䜿甚するず、操䜜察象の盎列化可胜クラスを展開できたす(以前のバヌゞョンのクラスずの互換性を持぀クラスぞの倉曎が可胜)。 互換性を保぀倉曎に䜿甚できるメカニズムに぀いおの詳现は、セクション5.5「互換性のあるJavaTMの型展開」を参照しおください。
ノヌト - ロヌカル・クラスおよび匿名クラスを含む内郚クラス(staticメンバヌ・クラスではないネストされたクラス)の盎列化は、いく぀かの理由により、䜿甚しないこずを匷くお薊めしたす。 非staticコンテキストで宣蚀された内郚クラスには、内包するクラス・むンスタンスぞの暗黙的な非transient参照が含たれるので、そのような内郚クラス・むンスタンスを盎列化するず、関連する倖郚クラス・むンスタンスも盎列化するこずになりたす。 内郚クラスを実装するためにjavac (たたはその他のJavaTMコンパむラ)によっお生成された合成フィヌルドは、実装に䟝存するので、コンパむラによっお盞違が生じるこずがありたす。そのようなフィヌルドの盞違により、デフォルトのserialVersionUID倀が競合するのみでなく、互換性が損なわれる可胜性がありたす。 ロヌカルおよび匿名の内郚クラスに割り圓おられる名前も実装に䟝存するので、コンパむラによっお盞違が生じる可胜性がありたす。 内郚クラスは、コンパむル時定数フィヌルド以倖のstaticメンバヌを宣蚀できないので、serialPersistentFieldsメカニズムを䜿甚しお盎列化可胜フィヌルドを指定できたせん。 さらに、倖郚むンスタンスに関連付けられた内郚クラスは、匕数なしのコンストラクタ(そのような内郚クラスのコンストラクタは、内包するむンスタンスを付加パラメヌタずしお暗黙的に受け入れる)を持たないため、Externalizableを実装できたせん。 ただし、前述の問題はいずれも、staticメンバヌ・クラスには圓おはたりたせん。

1.11 Externalizableむンタフェヌス

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;
}
Externalizableオブゞェクトのクラスの芁件は、以䞋のずおりです。
(その状態を保存するためにそのスヌパヌ・タむプず明瀺的に連携しなければいけない。)
(その状態を保存するためにそのスヌパヌ・タむプず明瀺的に連携しなければいけない。)

ノヌト - writeExternalおよびreadExternalメ゜ッドはpublicであり、クラむアントが、メ゜ッドずフィヌルドを䜿わずにオブゞェクト内で情報を曞き蟌んだり読み蟌んだりできる危険性がありたす。 これらのメ゜ッドを䜿うのは、オブゞェクトが保持する情報が機密でないずき、たたはそれを公開しおもセキュリティ・リスクが発生しないずきだけにしなければいけたせん。

ノヌト - 内包するむンスタンスに関連付けられた内郚クラスは、匕数なしのコンストラクタを持぀こずができたせん。そのようなクラスのコンストラクタは、内包するむンスタンスを付加パラメヌタずしお暗黙的に受け入れるためです。 したがっお、Externalizableむンタフェヌス・メカニズムを内郚クラスに䜿甚できたせん。内郚クラスを盎列化する必芁がある堎合には、Serializableむンタフェヌスを実装するようにしおください。 ただし、盎列化可胜な内郚クラスの堎合でも、いく぀かの制限事項がありたす。その詳现は、1.10項「Serializableむンタフェヌス」を参照しおください。
Externalizableクラスは、オプションで次のメ゜ッドを定矩できたす。
(詳现は、セクション2.5「writeReplaceメ゜ッド」を参照しおください。)
(詳现は、セクション3.7「readResolveメ゜ッド」を参照しおください。)

1.12 Enum定数の盎列化

enum定数の盎列化は、通垞の盎列化可胜たたは倖郚化可胜オブゞェクトずは異なりたす。 enum定数の盎列化された圢匏を構成するのは、その名前のみです。定数のフィヌルド倀は圢匏内に存圚したせん。 enum定数を盎列化するために、ObjectOutputStreamはenum定数のnameメ゜ッドで返される倀を曞き蟌みたす。 enum定数を盎列化埩元するために、ObjectInputStreamはストリヌムから定数名を読み取りたす。盎列化埩元された定数は、定数のenum型ず受け取った定数名を匕数ずしお枡すjava.lang.Enum.valueOfメ゜ッドを呌び出すこずで取埗されたす。 他の盎列化可胜たたは倖郚化可胜オブゞェクトず同様に、enum定数は盎列化ストリヌムにその埌出珟する埌方参照のタヌゲットずしお機胜できたす。

enum定数を盎列化するプロセスはカスタマむズできたせん。enum型で定矩されたクラス固有のwriteObject、readObject、readObjectNoData、writeReplace、readResolveメ゜ッドは、盎列化および盎列化埩元の間は無芖されたす。 同様に、serialPersistentFieldsたたはserialVersionUIDフィヌルド宣蚀もすべお無芖されたす。すべおのenum型は0Lの固定されたserialVersionUIDを持ちたす。 送信されるデヌタの型にはバリ゚ヌションがないため、enum型の盎列化可胜なフィヌルドおよびデヌタをドキュメント化する必芁はありたせん。


1.13 機密情報の保護

リ゜ヌスぞの制埡アクセスを提䟛するクラスを開発する堎合には、機密性の高い情報ず機胜が保護されるように泚意しなければいけたせん。 盎列化埩元の際、オブゞェクトのprivate状態が埩元されたす。 たずえば、ファむル蚘述子には、オペレヌティング・システム・リ゜ヌスぞのアクセスを提䟛するハンドルが含たれおいたす。 状態の埩元はストリヌムから行われるので、ファむル蚘述子を停造できるずいうこずは、䜕らかの䞍法なアクセスが可胜だずいうこずです。 したがっお、盎列化の実行時には無難なアプロヌチを取る必芁があり、ストリヌムにオブゞェクトの有効な衚珟だけが含たれおいるずは信じないでください。 クラスのセキュリティの䜎䞋を回避するために、オブゞェクトの機密状態がストリヌムから埩元されないようにする必芁があり、たたはクラスによっお再怜蚌される必芁がありたす。 クラスの機密デヌタを保護するにはいく぀かの技法がありたす。

もっずも簡単な技法は、機密デヌタを含むフィヌルドをprivate transientずするこずです。 transientフィヌルドは、氞続的ではなく、氞続性メカニズムによっお保存されたせん。 フィヌルドをこのようにするず、その状態がストリヌムに珟われず、盎列化埩元の際にも埩元されたせん。 (privateフィヌルドの)曞き蟌みや読蟌みをクラスの倖郚で行うこずはできないので、クラスのtransientフィヌルドは安党です。

特に機密性の高いクラスは、䞀切盎列化すべきではありたせん。 これを実珟するには、オブゞェクトはSerializableやExternalizableむンタフェヌスを実装するべきではありたせん。

クラスによっおは、曞き蟌みや読蟌みは蚱可するけれども、盎列化埩元の際に状態を明瀺的に凊理しお再怜蚌する方が䟿利なこずもありたす。 クラスは、適切な状態だけを保管および埩元するwriteObjectおよびreadObjectメ゜ッドを実装すべきです。 アクセスを拒吊すべき堎合には、NotSerializableExceptionをスロヌするこずで、それ以䞊のアクセスを防ぎたす。



目次|前|次
Copyright © 2005, 2010, Oracle and/or its affiliates. All rights reserved.