|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.io.OutputStream
java.io.ObjectOutputStream
public class ObjectOutputStream
Java の基本データ型とオブジェクトグラフを OutputStream に書き込みます。これらのオブジェクトを読み込む (再構築する) には ObjectInputStream を使います。オブジェクトの持続的記憶は、そのストリームのためのファイルを使えば可能です。ストリームがネットワークソケットストリームの場合は、ほかのホストやほかのプロセス上でオブジェクトを再構築することもできます。
ストリームに書き込めるのは java.io.Serializable インタフェースをサポートするオブジェクトだけです。各直列化可能オブジェクトのクラスは、クラスの名前とシグニチャー、オブジェクトのフィールド値と配列、および初期オブジェクトから参照されるほかのすべてのオブジェクトのクロージャを含めてエンコードされます。
オブジェクトをストリームに書き込むには writeObject メソッドを使います。String や配列を含む任意のオブジェクトが writeObject によって書き込まれます。複数のオブジェクトやプリミティブも、ストリームへの書き込みが可能です。オブジェクトを読み込むときは、対応する ObjectInputstream から同じ型として、かつ書き込まれたときと同じ順序で読み込まなければなりません。
基本データ型をストリームに書き込むには、DataOutput の適切なメソッドを使います。String を書き込む場合は writeUTF メソッドを使います。
オブジェクトのデフォルトの直列化機構は、クラスのオブジェクト、クラスのシグニチャー、およびすべての非 transient と非 static フィールドの持つ値を書き込みます。ほかのオブジェクトへの参照 (transient と static フィールドは除く) があれば、これらのオブジェクトもやはり書き込まれます。単一オブジェクトへの多重参照は参照共有機構によりエンコードされ、オブジェクトグラフを、オリジナルが書き込まれたときの形状に復元することができます。
たとえば、ObjectInputStream の例で読み込めるようにオブジェクトを書き込むには、次のようにします。
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());
oos.close();
直列化と直列化復元の際に特殊な扱いが必要なクラスでは、正確に次のようなシグニチャーを持つ特殊なメソッドを実装する必要があります。
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException
writeObject メソッドは、対応する readObject がオブジェクトの状態を復元することができるように、オブジェクトの特定のクラスについて、オブジェクトの状態を書き込む責任があります。このメソッドは、オブジェクトのスーパークラスやサブクラスに属する状態に関与する必要はありません。状態を保存するには、個々のフィールドについて writeObject メソッドを使って ObjectOutputStream に書き込むか、または DataOutput がサポートする基本データ型用のメソッドを使用します。
直列化は、java.io.Serializable インタフェースを実装しないオブジェクトのフィールドの書き込みは行いません。直列化可能でないオブジェクトのサブクラスを直列化可能にすることは可能です。この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。この場合、直列化可能でないクラスの状態を保存および再構築するのは、サブクラスの責任になります。そのクラスのフィールドがアクセス可能である (public、package、または protected) か、または状態を再構築するために使える get と set メソッドが存在する場合がしばしばあります。
writeObject と readObject メソッドで NotSerializableException をスローするように実装しておくと、オブジェクトの直列化を防止できます。例外は、ObjectOutputStream にキャッチされ、直列化処理を異常終了させます。
Externalizable インターフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。Externalizable インターフェースのメソッドである writeExternal と readExternal は、オブジェクトの状態を保存および復元するために呼び出されます。これらのメソッドは、クラスによって実装された場合には、ObjectOutput と ObjectInput のすべてのメソッドを使って、自身の状態の書き込みおよび読み込みを行うことができます。どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。
enum 定数は、通常の直列化可能オブジェクトや外部化可能オブジェクトとは異なった方法で直列化されます。enum 定数の直列化形式は名前のみで構成されます。定数のフィールド値は転送されません。enum 定数を直列化するために、ObjectOutputStream は定数の名前メソッドから返された文字列を書き込みます。他の直列化可能オブジェクトまたは外部化可能オブジェクトと同様、enum 定数も、直列化ストリームにあとから現れる逆参照のターゲットとして機能できます。enum 定数が直列化される手順はカスタマイズできません。つまり、enum 型によって定義された、クラス特有の writeObject および writeReplace メソッドは、直列化の間は無視されます。同様に、serialPersistentFields または serialVersionUID フィールド宣言も無視されます。すべての enum 型は、serialVersionUID が 0L に固定されています。
直列化可能フィールドおよび外部化可能データを除くプリミティブデータは、ブロックデータレコードとして ObjectOutputStream に書き込まれます。ブロックデータレコードは、ヘッダとデータで構成されます。ブロックデータのヘッダは、マーカおよびヘッダに続くバイト数で構成されます。連続するプリミティブデータの書き込みは、1 つのブロックデータレコードにマージされます。ブロックデータレコードに使用されるブロック係数は 1024 バイトです。各ブロックデータレコードは、1024 バイトまで埋め込まれるか、ブロックデータモードの終了まで書き込まれます。ObjectOutputStream のメソッド writeObject、defaultWriteObject、および writeFields を呼び出すと、最初に既存のブロックデータレコードが終了されます。
DataOutput,
ObjectInputStream,
Serializable,
Externalizable,
Object Serialization Specification, Section 2, Object Output Classes| 入れ子のクラスの概要 | |
|---|---|
static class |
ObjectOutputStream.PutField
ObjectOutput に書き込まれる持続フィールドへのプログラムによるアクセスを提供します。 |
| フィールドの概要 |
|---|
| コンストラクタの概要 | |
|---|---|
protected |
ObjectOutputStream()
ObjectOutputStream を完全に実装し直すサブクラスが、ObjectOutputStream のこの実装によって使用されたばかりの private データを割り当てる必要がないようにする手段を提供します。 |
|
ObjectOutputStream(OutputStream out)
指定された OutputStream に書き込む ObjectOutputStream を作成します。 |
| メソッドの概要 | |
|---|---|
protected void |
annotateClass(Class<?> cl)
サブクラスは、クラスのデータをストリームに保存できるようにこのメソッドを実装する場合があります。 |
protected void |
annotateProxyClass(Class<?> cl)
サブクラスはこのメソッドを実装して、ダイナミックプロキシクラスに対する記述子とともにカスタムデータをストリームに格納します。 |
void |
close()
ストリームを閉じます。 |
void |
defaultWriteObject()
現在のクラスの非 static フィールドと非 transient フィールドを、ストリームに書き込みます。 |
protected void |
drain()
ObjectOutputStream にあるバッファデータをすべて空にします。 |
protected boolean |
enableReplaceObject(boolean enable)
ストリーム内でオブジェクトを置換できるようにします。 |
void |
flush()
ストリームをフラッシュします。 |
ObjectOutputStream.PutField |
putFields()
ストリームに書き込まれる持続フィールドをバッファに格納するために使用されるオブジェクトを取得します。 |
protected Object |
replaceObject(Object obj)
直列化の際に、ObjectOutputStream の信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。 |
void |
reset()
ストリームにすでに書き込まれているオブジェクトの状態を無効にします。 |
void |
useProtocolVersion(int version)
ストリームの書き込み時に使用するストリームプロトコルのバージョンを指定します。 |
void |
write(byte[] buf)
バイト配列を書き込みます。 |
void |
write(byte[] buf,
int off,
int len)
バイト配列の一部を書き込みます。 |
void |
write(int val)
データのバイトを書き込みます。 |
void |
writeBoolean(boolean val)
boolean を書き込みます。 |
void |
writeByte(int val)
8 ビットのバイトを書き込みます。 |
void |
writeBytes(String str)
String をバイトの列として書き込みます。 |
void |
writeChar(int val)
16 ビットの char を書き込みます。 |
void |
writeChars(String str)
String を char の列として書き込みます。 |
protected void |
writeClassDescriptor(ObjectStreamClass desc)
ObjectOutputStream に指定されたクラス記述子を書き込みます。 |
void |
writeDouble(double val)
64 ビットの double を書き込みます。 |
void |
writeFields()
バッファに格納されたフィールドをストリームに書き込みます。 |
void |
writeFloat(float val)
32 ビットの float を書き込みます。 |
void |
writeInt(int val)
32 ビットの int を書き込みます。 |
void |
writeLong(long val)
64 ビットの long を書き込みます。 |
void |
writeObject(Object obj)
指定されたオブジェクトを ObjectOutputStream に書き込みます。 |
protected void |
writeObjectOverride(Object obj)
サブクラスによってデフォルトの writeObject メソッドのオーバーライドに使用されます。 |
void |
writeShort(int val)
16 ビットの short を書き込みます。 |
protected void |
writeStreamHeader()
サブクラスが自身のヘッダをストリームの前または後ろに追加できるように提供されています。 |
void |
writeUnshared(Object obj)
ObjectOutputStream に「共有されない」オブジェクトを書き込みます。 |
void |
writeUTF(String str)
この String のプリミティブデータを修正 UTF-8 形式で書き込みます。 |
| クラス java.lang.Object から継承されたメソッド |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| コンストラクタの詳細 |
|---|
public ObjectOutputStream(OutputStream out)
throws IOException
セキュリティマネージャがインストールされている場合、ObjectOutputStream.putFields メソッドまたは ObjectOutputStream.writeUnshared メソッドをオーバーライドするサブクラスのコンストラクタによって SerializablePermission("enableSubclassImplementation") が直接または間接に呼び出されたときに、このコンストラクタはこのアクセス権を確認します。
out - 書き込み先の出力ストリーム
IOException - ストリームヘッダの書き込み中に入出力エラーが発生した場合
SecurityException - 信頼されていないサブクラスが、セキュリティ上重要なメソッドを不正にオーバーライドした場合
NullPointerException - out が null の場合ObjectOutputStream(),
putFields(),
ObjectInputStream.ObjectInputStream(InputStream)
protected ObjectOutputStream()
throws IOException,
SecurityException
セキュリティマネージャがインストールされている場合、このメソッドはまずセキュリティマネージャの checkPermission メソッドをアクセス権 SerializablePermission("enableSubclassImplementation") で呼び出し、サブクラス化を有効にできるようにします。
SecurityException - セキュリティマネージャが存在し、その checkPermission メソッドがサブクラス化を有効にすることを拒否した場合
IOExceptionSecurityManager.checkPermission(java.security.Permission),
SerializablePermission| メソッドの詳細 |
|---|
public void useProtocolVersion(int version)
throws IOException
このルーチンは、現在のバージョンの直列化が、前のバージョンのストリーム形式と下位互換性のある形式で書き込めるようにするフックを提供します。
下位互換性のない形式がさらに導入されるのを防ぐためにあらゆる努力が行われますが、選択の余地のない場合もあります。
version - java.io.ObjectStreamConstants から ProtocolVersion を使用
IllegalStateException - オブジェクトが直列化されたあとに呼び出された場合
IllegalArgumentException - 渡されたバージョンが無効な場合
IOException - 入出力エラーが発生した場合ObjectStreamConstants.PROTOCOL_VERSION_1,
ObjectStreamConstants.PROTOCOL_VERSION_2
public final void writeObject(Object obj)
throws IOException
例外は、OutputStream に関する問題や、直列化するべきではないクラスについてスローされます。すべての例外は、OutputStream にとって致命的で、OutputStream を不確定な状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼び出し側です。
ObjectOutput 内の writeObjectobj - 書き込まれるオブジェクト
InvalidClassException - 直列化で使用されるクラスになんらかの不具合があった場合
NotSerializableException - 直列化の対象オブジェクトが java.io.Serializable インタフェースを実装していない場合
IOException - 基本となる OutputStream が例外をスローした場合
protected void writeObjectOverride(Object obj)
throws IOException
obj - 基本となるストリームに書き込まれるオブジェクト
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合ObjectOutputStream(),
writeObject(Object)
public void writeUnshared(Object obj)
throws IOException
このメソッドをオーバーライドする ObjectOutputStream サブクラスは、SerializablePermission("enableSubclassImplementation") を持つセキュリティコンテキスト内だけで構築できます。このアクセス権を持たないセキュリティコンテキストでインスタンス化しようとすると、SecurityException がスローされます。
obj - ストリームに書き込むオブジェクト
NotSerializableException - 直列化するグラフ内のオブジェクトが Serializable インターフェースを実装しない場合
InvalidClassException - 直列化するオブジェクトのクラスに問題がある場合
IOException - 直列化中に入出力エラーが発生した場合
public void defaultWriteObject()
throws IOException
IOException - 基本となる OutputStream の書き込み中に入出力エラーが発生した場合
public ObjectOutputStream.PutField putFields()
throws IOException
IOException - 入出力エラーが発生した場合
public void writeFields()
throws IOException
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
NotActiveException - オブジェクトの状態を書き込むためにクラスの writeObject メソッドが呼び出されなかったときに呼び出された場合
public void reset()
throws IOException
IOException - オブジェクトを直列化中に reset() が呼び出された場合
protected void annotateClass(Class<?> cl)
throws IOException
cl - カスタムデータに注釈を付けるクラス
IOException - 基本となる OutputStream が例外をスローした場合
protected void annotateProxyClass(Class<?> cl)
throws IOException
このメソッドはストリームの一意のプロキシクラス記述子のそれぞれについて 1 回だけ呼び出されます。ObjectOutputStream にあるこのメソッドのデフォルト実装は何もしません。
ObjectInputStream での対応するメソッドは resolveProxyClass です。このメソッドをオーバーライドする指定されたサブクラス ObjectOutputStream に対して、ObjectInputStream の対応するサブクラスにある resolveProxyClass メソッドは annotateProxyClass が書き込む任意のデータまたはオブジェクトを読み込む必要があります。
cl - カスタムデータに注釈を付けるプロキシクラス
IOException - 基本となる OutputStream が例外をスローした場合ObjectInputStream.resolveProxyClass(String[])
protected Object replaceObject(Object obj)
throws IOException
ObjectOutputStream.writeObject メソッドは Object 型のパラメータ (Serializable 型とは異なる) を取り、直列化可能でないオブジェクトが直列化可能オブジェクトに置き換えられるようにします。
サブクラスは、オブジェクトを置換するとき、直列化復元実行時に相補的に置換が行われるか、または置換されたオブジェクトと、参照が格納される各フィールドとの互換性を保証する必要があります。フィールドまたは配列要素の型のサブクラスではない型のオブジェクトは、例外を発生させることによって直列化を中断し、その結果オブジェクトは格納されません。
このメソッドは、各オブジェクトが最初に検出されたときに 1 回だけ呼び出されます。これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。このメソッドは、置換されるメソッドか、またはオリジナルのどちらかを返さなければなりません。
置換されるオブジェクトとして null を返すこともできますが、オリジナルオブジェクトへの参照を含むクラスでは、null ではなくオブジェクトが返されることを仮定しているものがあり、この場合は NullReferenceException がスローされます。
obj - 置き換えられるオブジェクト
IOException - 基本となる OutputStream が例外をスローした場合
protected boolean enableReplaceObject(boolean enable)
throws SecurityException
enable が true で、セキュリティマネージャがインストールされている場合、このメソッドはまずセキュリティマネージャの checkPermission メソッドをアクセス権 SerializablePermission("enableSubstitution") で呼び出し、ストリームのオブジェクトをストリームが置換できるようにします。
enable - オブジェクトの置き換えを可能にする boolean パラメータ
SecurityException - セキュリティマネージャが存在し、その checkPermission メソッドが、ストリーム内のオブジェクトのストリームによる置換を許可しなかった場合SecurityManager.checkPermission(java.security.Permission),
SerializablePermission
protected void writeStreamHeader()
throws IOException
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
protected void writeClassDescriptor(ObjectStreamClass desc)
throws IOException
readClassDescriptor は、オーバーライドされクラス記述子をカスタムストリーム表現から復元する必要があります。デフォルトでは、このメソッドは、オブジェクト直列化仕様で定義された形式に従ってクラス記述子を書き込みます。
このメソッドは ObjectOutputStream が古い直列化ストリーム形式 (ObjectOutputStream の useProtocolVersion メソッドを呼び出して設定) を使用していない場合に限り呼び出される点に注意してください。この直列化ストリームが古い形式 (PROTOCOL_VERSION_1) を使用している場合、クラス記述子はオーバーライドされない方法またはカスタマイズできない方法で内部的に書き込まれます。
desc - ストリームに書き込むクラス記述子
IOException - 入出力エラーが発生した場合ObjectInputStream.readClassDescriptor(),
useProtocolVersion(int),
ObjectStreamConstants.PROTOCOL_VERSION_1
public void write(int val)
throws IOException
DataOutput 内の writeObjectOutput 内の writeOutputStream 内の writeval - ストリームに書き込まれるバイト
IOException - 入出力エラーが発生した場合
public void write(byte[] buf)
throws IOException
DataOutput 内の writeObjectOutput 内の writeOutputStream 内の writebuf - 書き込まれるデータ
IOException - 入出力エラーが発生した場合OutputStream.write(byte[], int, int)
public void write(byte[] buf,
int off,
int len)
throws IOException
DataOutput 内の writeObjectOutput 内の writeOutputStream 内の writebuf - 書き込まれるデータoff - データの開始オフセットlen - 書き込まれるバイト数
IOException - 入出力エラーが発生した場合
public void flush()
throws IOException
Flushable 内の flushObjectOutput 内の flushOutputStream 内の flushIOException - 入出力エラーが発生した場合
protected void drain()
throws IOException
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void close()
throws IOException
Closeable 内の closeObjectOutput 内の closeOutputStream 内の closeIOException - 入出力エラーが発生した場合
public void writeBoolean(boolean val)
throws IOException
DataOutput 内の writeBooleanval - 書き込まれる boolean 値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeByte(int val)
throws IOException
DataOutput 内の writeByteval - 書き込まれるバイト値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeShort(int val)
throws IOException
DataOutput 内の writeShortval - 書き込まれる short 値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeChar(int val)
throws IOException
DataOutput 内の writeCharval - 書き込まれる char 値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeInt(int val)
throws IOException
DataOutput 内の writeIntval - 書き込まれる int 値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeLong(long val)
throws IOException
DataOutput 内の writeLongval - 書き込まれる long 値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeFloat(float val)
throws IOException
DataOutput 内の writeFloatval - 書き込まれる float 値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeDouble(double val)
throws IOException
DataOutput 内の writeDoubleval - 書き込まれる double 値
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeBytes(String str)
throws IOException
DataOutput 内の writeBytesstr - 書き込まれるバイトの文字列
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeChars(String str)
throws IOException
DataOutput 内の writeCharsstr - 書き込まれる char の文字列
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
public void writeUTF(String str)
throws IOException
DataOutput 内の writeUTFstr - 書き込まれる文字列
IOException - 基本となるストリームの書き込み中に入出力エラーが発生した場合
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。