|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--java.io.InputStream | +--java.io.ObjectInputStream
事前に ObjectOutputStream を使って作成されたプリミティブデータとプリミティブオブジェクトを直列化復元します。 ObjectOutputStream と ObjectInputStream は、FileOutputStream または FileInputStream とともに使えば、アプリケーションに、オブジェクトのグラフのための持続的なストレージを提供することができます。ObjectInputStream は、事前に直列化されたオブジェクトを元に戻すために使います。ほかの使用方法としては、ソケットストリームの使用による、ホスト間でのオブジェクトの受け渡しや、リモート通信システムにおける属性やパラメータの整列や整列解除があります。
ObjectInputStream は、ストリームから作成されたオブジェクトグラフにおけるすべての型のオブジェクトが、Java Virual Machine に存在するクラスに確実にマッチするようにします。クラスは、標準の機構を使って必要に応じてロードされます。
ストリームから読み込むことができるのは、java.io.Serializable インターフェースか java.io.Externalizable インターフェースをサポートするオブジェクトだけです。 オブジェクトをストリームから読み込むには readObject メソッドを使います。希望の型を取得するには、Java の安全なキャストを使う必要があります。Java では、文字列と配列はオブジェクトで、直列化の間はオブジェクトとして扱われます。それらを読み込む際には、希望の型にキャストされている必要があります。
基本データ型をストリームから読み込むには、DataInput の適切なメソッドを使います。
オブジェクトのデフォルトの直列化復元機構は、各フィールドの内容を、書き込まれたときの状態に戻します。transient または static と宣言されたフィールドは、直列化復元処理では無視されます。ほかのオブジェクトを参照すると、それらのオブジェクトは、必要に応じてストリームから読み込まれます。オブジェクトのグラフは、参照共有機構を使って正しく復元されます。直列化復元が行われるときには、常に新しいオブジェクトが割り当てられ、それによって既存のオブジェクトへの上書きが防止されます。
オブジェクトの読み込みは、新しいオブジェクトのコンストラクタの実行に似ています。メモリがオブジェクトに割り当てられ、ゼロ (NULL) に初期化されます。直列化可能でないクラスに対して、引数なしのコンストラクタが呼び出されたあと、直列化可能クラスのフィールドが、java.lang.Object にもっとも近いクラスから始まってもっともオブジェクトに固有のクラスで終わるストリームから復元されます。
たとえば、ObjectOutputStream の例で書き込まれたストリームからの読み込みは、次のように行います。
FileInputStream istream = new FileInputStream("t.tmp"); ObjectInputStream p = new ObjectInputStream(istream); int i = p.readInt(); String today = (String)p.readObject(); Date date = (Date)p.readObject(); istream.close();クラスは、インタフェース java.io.Serializable または java.io.Externalizable を実装することによって、クラスがどのように直列化されるかを制御します。
Serializable インターフェースを実装することによって、オブジェクトの直列化が、オブジェクトの状態全体の保存と復元を行うことが可能になり、またクラスが、ストリームの書き込み時とストリームの読み込み時の間に展開することが可能になります。オブジェクトの直列化は、オブジェクト間の参照を自動的に移動し、オブジェクトグラフの全体を保存および復元します。 直列化処理と直列化復元処理のときに特別な操作を必要とする Serializable クラスは、次のメソッドの両方を実装する必要があります。
private void writeObject(java.io.ObjectOutputStream stream) throws IOException; private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException;
readObject メソッドは、対応する writeObject メソッドによってストリームに書き込まれたデータを使用する特定のクラスについて、オブジェクトの状態を保存および復元する責任を持ちます。このメソッドは、そのスーパークラスやサブクラスに属する状態に関与する必要はありません。状態を復元するには、個々のフィールドについて ObjectInputStream からデータを読み込み、オブジェクトの適切なフィールドへの割り当てを行います。基本データ型の読み込みは、DataInput によってサポートされます。
直列化は、java.io.Serializable インターフェースを実装しないオブジェクトのフィールドの読み込みや、それらのフィールドへの値の割り当ては行いません。直列化可能でないオブジェクトのサブクラスを直列化可能にすることは可能です。この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。この場合、直列化可能でないクラスの状態を保存および復元するのは、サブクラスの責任になります。 そのクラスのフィールドがアクセス可能である (public、package、または protected) 場合、あるいは状態の復元に利用できる set メソッドや get メソッドがある場合がしばしばあります。
オブジェクトを直列化復元する間に発生したすべての例外は、ObjectInputStream にキャッチされ、読み込み処理を異常終了させます。
Externalizable インターフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。Externalizable インターフェースのメソッドである writeExternal と readExternal は、オブジェクトの状態を保存および復元するために呼び出されます。これらのメソッドは、クラスによって実装された場合には、ObjectOutput と ObjectInput のすべてのメソッドを使って、自身の状態の書き込みおよび読み込みを行うことができます。どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。
DataInput
,
ObjectOutputStream
,
Serializable
,
Java オブジェクト直列化仕様の第 3 章 オブジェクト入力クラス内部クラスの概要 | |
static class |
ObjectInputStream.GetField
入力ストリームから読み込まれた持続フィールドへのアクセスを提供します。 |
コンストラクタの概要 | |
protected |
ObjectInputStream()
ObjectInputStream を完全に再実装するサブクラスが、ObjectInputStream のこの実装によって使用されたばかりの private データを割り当てる必要がないようにする手段を提供します。 |
|
ObjectInputStream(InputStream in)
指定された InputStream から読み込む ObjectInputStream を作成します。 |
メソッドの概要 | |
int |
available()
ブロックせずに読み込むことができるバイト数を返します。 |
void |
close()
入力ストリームを閉じます。 |
void |
defaultReadObject()
現在のクラスの非 static および非 transient のフィールドを、このストリームから読み込みます。 |
protected boolean |
enableResolveObject(boolean enable)
ストリームから読み込まれたオブジェクトを置換できるようにします。 |
int |
read()
データのバイトを読み込みます。 |
int |
read(byte[] b,
int off,
int len)
バイトの配列に読み込みます。 |
boolean |
readBoolean()
boolean を読み込みます。 |
byte |
readByte()
8 ビットのバイトを読み込みます。 |
char |
readChar()
16 ビットの char を読み込みます。 |
double |
readDouble()
64 ビットの double を読み込みます。 |
ObjectInputStream.GetField |
readFields()
ストリームから持続フィールドを読み込み、それらを名前を指定してアクセスできるようにします。 |
float |
readFloat()
32 ビットの float を読み込みます。 |
void |
readFully(byte[] data)
バイトを読み込みます。 |
void |
readFully(byte[] data,
int offset,
int size)
バイトを読み込みます。 |
int |
readInt()
32 ビットの int を読み込みます。 |
String |
readLine()
推奨されません。 このメソッドはバイトを正確に文字に変換しません。詳細および代替については DataInputStream を参照してください。 |
long |
readLong()
64 ビットの long を読み込みます。 |
Object |
readObject()
ObjectInputStream からオブジェクトを読み込みます。 |
protected Object |
readObjectOverride()
引数なしの protected コンストラクタを使用して ObjectOutputStream を作成した ObjectOutputStream の信頼できるサブクラスによって呼び出されます。 |
short |
readShort()
16 ビットの short を読み込みます。 |
protected void |
readStreamHeader()
サブクラスが自身のストリームヘッダの読み込みと検証を行えるようにするために提供されています。 |
int |
readUnsignedByte()
符号なし 8 ビットバイトを読み込みます。 |
int |
readUnsignedShort()
符号なし 16 ビットの short を読み込みます。 |
String |
readUTF()
UTF 形式の文字列を読み込みます。 |
void |
registerValidation(ObjectInputValidation obj,
int prio)
オブジェクトグラフが返される前に検証されるべきオブジェクトを登録します。 |
protected Class |
resolveClass(ObjectStreamClass v)
指定されたストリームクラスの記述に対応するローカルクラスをロードします。 |
protected Object |
resolveObject(Object obj)
直列化復元の際に、ObjectInputStream の信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。 |
int |
skipBytes(int len)
バイトをスキップします。 |
クラス java.io.InputStream から継承したメソッド |
mark,
markSupported,
read,
reset,
skip |
クラス java.lang.Object から継承したメソッド |
clone,
equals,
finalize,
getClass,
hashCode,
notify,
notifyAll,
toString,
wait,
wait,
wait |
コンストラクタの詳細 |
public ObjectInputStream(InputStream in) throws IOException, StreamCorruptedException
protected ObjectInputStream() throws IOException, SecurityException
セキュリティマネージャがインストールされている場合、このメソッドはまずセキュリティマネージャの checkPermission
メソッドをアクセス権 SerializablePermission("enableSubclassImplementation")
で呼び出し、サブクラス化を有効にできるようにします。
checkPermission
メソッドが、サブクラス化を有効にすることを拒否した場合SecurityManager.checkPermission(java.security.Permission)
,
java.security.SerializablePermission
メソッドの詳細 |
public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException
ルートオブジェクトは、参照するフィールドとオブジェクトのすべてが復元された時、完全に復元されます。この時点で、それらの登録された優先順位に基づいて、オブジェクト検証コールバックが実行されます。このコールバックは、(特別な readObject メソッドの) オブジェクトによって、それらが個別に復元されるときに登録されます。 例外は、InputStream に関する問題や、直列化復元するべきではないクラスについてスローされます。すべての例外は、InputStream にとって致命的で、InputStream を不確定の状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼び出し側です。
protected Object readObjectOverride() throws OptionalDataException, ClassNotFoundException, IOException
ObjectInputStream()
,
readObject()
public void defaultReadObject() throws IOException, ClassNotFoundException, NotActiveException
public ObjectInputStream.GetField readFields() throws IOException, ClassNotFoundException, NotActiveException
public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException
obj
- 検証のコールバックを受け取るオブジェクトprio
- コールバックの順序を制御する値。0 が適切なデフォルト値である。早くコールバックする場合は大きい番号を、あとでコールバックする場合は小さい番号を使う。同じ優先順位内では、コールバックの処理に特別な順序はないprotected Class resolveClass(ObjectStreamClass v) throws IOException, ClassNotFoundException
デフォルトでは、クラス名は、readObject を呼び出したクラスと対応付けて解決されます。
protected Object resolveObject(Object obj) throws IOException
このメソッドは、オブジェクトが読み込まれたあと、readObject が返される前に呼び出されます。デフォルトの resolveObject メソッドは、新しいオブジェクトだけを返します。
サブクラスは、オブジェクトを置換するとき、置換されたオブジェクトと、参照が格納される各フィールドとの互換性を保証する必要があります。フィールドまたは配列要素の型のサブクラスではない型のオブジェクトは、例外を発生させることによって直列化を中断し、その結果オブジェクトは格納されません。
このメソッドは、各オブジェクトが最初に検出されたときに 1 回だけ呼び出されます。これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。
protected boolean enableResolveObject(boolean enable) throws SecurityException
checkPermission
メソッドをアクセス権 SerializablePermission("enableSubstitution")
で呼び出し、ストリームから読み込まれたオブジェクトの置換をストリームが許可できるようにします。checkPermission
メソッドが、ストリームから読み込まれたオブジェクトの置換をストリームが許可できるようにすることを拒否する場合SecurityManager.checkPermission(java.security.Permission)
,
java.security.SerializablePermission
protected void readStreamHeader() throws IOException, StreamCorruptedException
public int read() throws IOException
public int read(byte[] b, int off, int len) throws IOException
b
- データの読み込み先のバッファoff
- データの開始オフセットlen
- 読み込まれるバイトの最大値DataInputStream.readFully(byte[],int,int)
public int available() throws IOException
public void close() throws IOException
public boolean readBoolean() throws IOException
public byte readByte() throws IOException
public int readUnsignedByte() throws IOException
public short readShort() throws IOException
public int readUnsignedShort() throws IOException
public char readChar() throws IOException
public int readInt() throws IOException
public long readLong() throws IOException
public float readFloat() throws IOException
public double readDouble() throws IOException
public void readFully(byte[] data) throws IOException
b
- データの読み込み先のバッファpublic void readFully(byte[] data, int offset, int size) throws IOException
b
- データの読み込み先のバッファoff
- データの開始オフセットlen
- 読み込むバイトの最大数public int skipBytes(int len) throws IOException
n
- スキップされるバイト数public String readLine() throws IOException
public String readUTF() throws IOException
|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |