モジュール java.base
パッケージ java.io

クラスObjectInputStream

java.lang.Object
java.io.InputStream
java.io.ObjectInputStream
すべての実装されたインタフェース:
Closeable, DataInput, ObjectInput, ObjectStreamConstants, AutoCloseable

public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
事前にObjectOutputStreamを使って作成されたプリミティブ・データとプリミティブ・オブジェクトを直列化復元します。

警告: 信頼できないデータの直列化復元は、本質的に危険であり、回避する必要があります。 「Java SEに対するセキュア・コーディングのガイドライン」の"直列化および直列化復元"セクションに従って、信頼できないデータを慎重に検証する必要があります。 「直列化フィルタリング」では、シリアル・フィルタの使いやすさに関するベスト・プラクティスについて説明します。

直列化復元攻撃を無効にするキーは、任意のクラスのインスタンスが直列化復元されないようにし、そのメソッドの直接または間接的な実行を防ぐことです。 ObjectInputFilterはフィルタの使用方法を示し、ObjectInputFilter.Configはフィルタおよびフィルタ・ファクトリの構成方法を示します。 各ストリームには、直列化復元中にクラスおよびリソース制限をチェックするオプションの直列化復元フィルタがあります。 JVM全体のフィルタ・ファクトリにより、ObjectInputStreamごとにフィルタを設定でき、ストリームから読み取られるすべてのオブジェクトをチェックできます。 「ObjectInputStreamコンストラクタ」は、setObjectInputFilter(java.io.ObjectInputFilter)によって更新または置換される初期フィルタを選択するために、フィルタ・ファクトリを起動します。

ObjectInputStreamにフィルタがある場合、ObjectInputFilterでは、クラス、配列の長さ、ストリーム内の参照数、深さおよび入力ストリームから消費されたバイト数が許可され、そうでない場合には、直列化復元を終了できます。

ObjectOutputStreamとObjectInputStreamは、FileOutputStreamまたはFileInputStreamとともに使えば、アプリケーションに、オブジェクトのグラフのための持続的なストレージを提供することができます。 ObjectInputStreamは、事前に直列化されたオブジェクトを元に戻すために使います。 ほかの使用方法としては、ソケット・ストリームの使用による、ホスト間でのオブジェクトの受け渡しや、リモート通信システムでの属性やパラメータの整列や整列解除があります。

ObjectInputStreamは、ストリームから作成されたオブジェクト・グラフでのすべての型のオブジェクトが、Java Virtual Machineに存在するクラスに確実にマッチするようにします。 クラスは、標準のメカニズムを使って必要に応じてロードされます。

ストリームから読み込むことができるのは、java.io.Serializableインタフェースかjava.io.Externalizableインタフェースをサポートするオブジェクトだけです。

オブジェクトをストリームから読み込むにはreadObjectメソッドを使います。 希望の型を取得するには、Javaの安全なキャストを使う必要があります。 Javaでは、文字列と配列はオブジェクトで、直列化の間はオブジェクトとして扱われます。 それらを読み込む際には、希望の型にキャストされている必要があります。

プリミティブ・データ型をストリームから読み込むには、DataInputの適切なメソッドを使います。

オブジェクトのデフォルトの直列化復元メカニズムは、各フィールドの内容を、書き込まれたときの状態に戻します。 transientまたはstaticと宣言されたフィールドは、直列化復元処理では無視されます。 ほかのオブジェクトを参照すると、それらのオブジェクトは、必要に応じてストリームから読み込まれます。 オブジェクトのグラフは、参照共有メカニズムを使って正しく復元されます。 直列化復元が行われるときには、常に新しいオブジェクトが割り当てられ、それによって既存のオブジェクトへの上書きが防止されます。

オブジェクトの読込みは、新しいオブジェクトのコンストラクタの実行に似ています。 メモリーがオブジェクトに割り当てられ、ゼロ(NULL)に初期化されます。 直列化可能でないクラスに対して、引数なしのコンストラクタが呼び出されたあと、直列化可能クラスのフィールドが、java.lang.Objectにもっとも近いクラスから始まって、もっともオブジェクトに固有のクラスで終わるストリームから復元されます。

たとえば、ObjectOutputStreamの例で書き込まれたストリームからの読込みは、次のように行います。

      FileInputStream fis = new FileInputStream("t.tmp");
      ObjectInputStream ois = new ObjectInputStream(fis);

      int i = ois.readInt();
      String today = (String) ois.readObject();
      Date date = (Date) ois.readObject();

      ois.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;
 private void readObjectNoData()
     throws ObjectStreamException;
 

readObjectメソッドは、対応するwriteObjectメソッドによってストリームに書き込まれたデータを使用する特定のクラスについて、オブジェクトの状態を読み込みおよび復元する責任を持ちます。 このメソッドは、そのスーパー・クラスやサブクラスに属する状態に関与する必要はありません。 状態を復元するには、個々のフィールドについてObjectInputStreamからデータを読み込み、オブジェクトの適切なフィールドへの割り当てを行います。 プリミティブ・データ型の読込みは、DataInputによってサポートされます。

オブジェクト・データを読み込もうとするときに、その位置が対応するwriteObjectメソッドによって書き込まれたカスタム・データの境界を超えている場合は、eofフィールドの値がtrueの状態でOptionalDataExceptionがスローされます。 オブジェクトを直列化して読み込もうとするときに、その位置が割当て済みデータの終わりを超えている場合は、ストリームの場合と同様に、データの終わりを示す例外が返されます。つまり、バイト単位の読込みでは、バイトが読み込まれたときに -1が返されます。プリミティブ読込みでは、EOFExceptionがスローされます。 対応するwriteObjectメソッドがない場合は、デフォルトの直列化データの終わりが割当て済みデータの終わりになります。

プリミティブ読み込みとオブジェクト読込みがreadExternalメソッドから呼び出された場合は、両方とも同じように動作します。ストリームの位置が対応するwriteExternalメソッドによって書き込まれたデータの終わりにある場合、オブジェクト読込みではeofがtrueに設定された状態でOptionalDataExceptionがスローされ、バイトの読込みでは -1を返し、プリミティブ読込みではEOFExceptionがスローされます。 ただし、古いObjectStreamConstants.PROTOCOL_VERSION_1プロトコルを使用して書き込まれたストリームでは、この動作は適用されません。writeExternalメソッドと異なり、データの終わりが書き込まれないため、データの終わりを検出できないためです。

readObjectNoDataメソッドは、あるクラスが直列化復元されるオブジェクトのスーパー・クラスとして直列化ストリームに指定されていないときに、そのクラスについてそのオブジェクトの状態を初期化します。 これは、受け取り側が、送り側とは異なるバージョンの直列化復元されたインスタンスのクラスを使用し、受け取り側のバージョンが送り側のバージョンによって継承されないクラスを継承する場合に発生する可能性があります。 また、直列化ストリームが改変された場合にも発生することがあります。したがって、readObjectNoDataは、「悪意のある」または不正なソース・ストリームであっても、直列化復元されたオブジェクトを正しく初期化するのに役立ちます。

直列化は、java.io.Serializableインタフェースを実装しないオブジェクトのフィールドの読込みや、それらのフィールドへの値の割当ては行いません。 直列化可能でないオブジェクトのサブクラスを直列化可能にすることができます。 この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。 この場合、直列化可能でないクラスの状態を保存および復元するのは、サブクラスの責任になります。 そのクラスのフィールドがアクセス可能である(public、package、またはprotected)場合、あるいは状態の復元に利用できるsetメソッドやgetメソッドがある場合がしばしばあります。

オブジェクトを直列化復元する間に発生したすべての例外は、ObjectInputStreamにキャッチされ、読込み処理を異常終了させます。

Externalizableインタフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。 ExternalizableインタフェースのメソッドであるwriteExternalとreadExternalは、オブジェクトの状態を保存および復元するために呼び出されます。 これらのメソッドは、クラスによって実装された場合には、ObjectOutputとObjectInputのすべてのメソッドを使って、自身の状態の書き込みおよび読込みを行うことができます。 どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。

enum定数の直列化復元は、通常の直列化可能または外部化可能オブジェクトとは異なります。 enum定数の直列化された形式を構成するのは、その名前だけです。定数のフィールド値は転送されません。 enum定数を直列化復元するには、ObjectInputStreamでストリームから定数名を読み込みます。次に、enum定数の基底型と受け取った定数名を引数としてstaticメソッドのEnum.valueOf(Class, String)を呼び出し、直列化復元された定数を取得します。 他の直列化可能または外部化可能オブジェクトと同様に、enum定数は直列化ストリームにその後出現する後方参照のターゲットとして機能できます。 enum定数を直列化復元するプロセスをカスタマイズすることはできません。enum型で定義された、クラス固有のreadObject、readObjectNoData、およびreadResolveメソッドはどれも直列化復元の間は無視されます。 同様に、serialPersistentFieldsまたはserialVersionUIDフィールド宣言もすべて無視されます。すべてのenum型は0Lの固定されたserialVersionUIDを持ちます。

レコードの直列化は、通常の直列化可能オブジェクトまたは外部化可能オブジェクトとは異なります。 レコードの直列化復元中に、レコード標準コンストラクタが呼び出されてレコード・オブジェクトが構成されます。 readObjectやwriteObjectなどの特定の直列化関連メソッドは、直列化可能レコードでは無視されます。 詳細は、Javaオブジェクト直列化仕様セクション1.13、"レコードの直列化"」を参照してください。

導入されたバージョン:
1.1
関連項目:
  • コンストラクタの詳細

    • ObjectInputStream

      public ObjectInputStream(InputStream in) throws IOException
      指定されたInputStreamから読み込むObjectInputStreamを作成します。 直列化ストリーム・ヘッダーは、ストリームから読み込まれたあと、検証されます。 このコンストラクタは、対応するObjectOutputStreamがヘッダーを書き込んでフラッシュするまでブロックします。

      コンストラクタは、現在のフィルタに対してnullを指定してObjectInputFilter.Config.getSerialFilterFactory()を起動し、リクエストされたフィルタに対して「静的JVM全体のフィルタ」を起動して、返されるフィルタに直列化復元フィルタを初期化します。

      セキュリティ・マネージャがインストールされている場合、ObjectInputStream.readFieldsメソッドまたはObjectInputStream.readUnsharedメソッドをオーバーライドするサブクラスのコンストラクタによってSerializablePermission("enableSubclassImplementation")が直接または間接に呼び出されたときに、このコンストラクタはこのアクセス権を確認します。

      パラメータ:
      in - 読込み元の入力ストリーム
      例外:
      StreamCorruptedException - ストリーム・ヘッダーが不正な場合
      IOException - ストリーム・ヘッダーの読込み中に入出力エラーが発生した場合
      SecurityException - 信頼できないサブクラスが、セキュリティ上重要なメソッドを不正にオーバーライドした場合
      NullPointerException - innullである場合
      関連項目:
    • ObjectInputStream

      protected ObjectInputStream() throws IOException, SecurityException
      ObjectInputStreamを完全に再実装するサブクラスが、ObjectInputStreamのこの実装によって使用されたばかりのprivateデータを割り当てる必要がないようにする手段を提供します。

      コンストラクタは、現在のフィルタに対してnullを指定してObjectInputFilter.Config.getSerialFilterFactory()を起動し、リクエストされたフィルタに対して「静的JVM全体のフィルタ」を起動して、返されるフィルタに直列化復元フィルタを初期化します。

      セキュリティ・マネージャがインストールされている場合、このメソッドはまずセキュリティ・マネージャのcheckPermissionメソッドをアクセス権SerializablePermission("enableSubclassImplementation")で呼び出し、サブクラス化を有効にできるようにします。

      例外:
      SecurityException - セキュリティ・マネージャが存在し、そのcheckPermissionメソッドがサブクラス化を有効にすることを拒否した場合。
      IOException - このストリームの作成中に入出力エラーが発生した場合
      関連項目:
  • メソッドの詳細

    • readObject

      public final Object readObject() throws IOException, ClassNotFoundException
      ObjectInputStreamからオブジェクトを読み込みます。 オブジェクトのクラス、クラスのシグネチャ、クラスの非transientフィールドおよび非staticフィールドの値とそのすべてのスーパー・タイプが読み込まれます。 あるクラスについてのデフォルトの直列化復元は、writeObjectメソッドとreadObjectメソッドを使用してオーバーライドできます。 このオブジェクトによって参照されるオブジェクトは中間的に読み込まれ、それによって、完全に同等なオブジェクト・グラフがreadObjectによって再構築されます。

      ルート・オブジェクトは、参照するフィールドとオブジェクトのすべてが復元された時、完全に復元されます。 この時点で、それらの登録された優先順位に基づいて、オブジェクト検証コールバックが実行されます。 このコールバックは、(特別なreadObjectメソッドの)オブジェクトによって、それらが個別に復元されるときに登録されます。

      直列化復元フィルタは、nullでない場合、ルート・オブジェクトを再構築するために各オブジェクト(レギュラまたはクラス)読取りに対して呼び出されます。 詳細については、setObjectInputFilterを参照してください。

      例外は、InputStreamに関する問題や、直列化復元すべきではないクラスについてスローされます。 すべての例外は、InputStreamにとって致命的で、InputStreamを不確定の状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼出し側です。

      定義:
      readObject、インタフェース: ObjectInput
      戻り値:
      ストリームから読み込まれたオブジェクト
      例外:
      ClassNotFoundException - 直列化されたオブジェクトのクラスが見つからなかった場合。
      InvalidClassException - 直列化復元で使用されるクラスに問題があります。
      StreamCorruptedException - ストリームの制御情報に一貫性がない場合。
      OptionalDataException - プリミティブ・データが、オブジェクトではなくストリームに見つかった場合。
      IOException - 通常の入出力関連の例外が発生した場合。
    • readObjectOverride

      protected Object readObjectOverride() throws IOException, ClassNotFoundException
      このメソッドは、引数なしのprotectedコンストラクタを使用して、ObjectInputStreamを構築したObjectInputStreamの信頼できるサブクラスによって呼び出されます。 サブクラスは、修飾子がfinalのオーバーライド・メソッドを提供するとみなされます。
      戻り値:
      ストリームから読み込まれたオブジェクト。
      例外:
      ClassNotFoundException - 直列化されたオブジェクトのクラス定義が見つからなかった場合。
      OptionalDataException - プリミティブ・データが、オブジェクトではなくストリームに見つかった場合。
      IOException - ベースとなるストリームの読込み中に入出力エラーが発生した場合
      導入されたバージョン:
      1.2
      関連項目:
    • readUnshared

      public Object readUnshared() throws IOException, ClassNotFoundException
      ObjectInputStreamから「共有されない」オブジェクトを読み込みます。 このメソッドは、readObjectと似ています。ただし、直後にreadObjectおよびreadUnsharedを呼び出し、この呼出しが取得した直列化復元されたインスタンスに対する追加の参照を返すことはできません。 具体的には、次のようになります。
      • readUnsharedを呼び出して逆参照(ストリームに書き込まれたオブジェクトのストリーム表現)を直列化復元しようとすると、ObjectStreamExceptionがスローされる。
      • readUnsharedが正常に復帰したあとで、readUnsharedが直列化復元したストリーム・ハンドルへの逆参照を直列化復元しようとすると、ObjectStreamExceptionがスローされる。
      readUnsharedを呼び出してオブジェクトを直列化復元すると、返されるオブジェクトに関連付けられているストリーム・ハンドルが無効になります。 ただし、readUnsharedから返される参照が一意であるとは限りません。直列化復元されたオブジェクトがreadResolveメソッドを定義して、ほかの組織が見ることができるオブジェクトを返すことがあります。また、readUnsharedがストリーム内のほかの場所や外部から取得できるClassオブジェクトまたはenum定数を返すこともあります。 直列化復元されたオブジェクトがreadResolveメソッドを定義し、このメソッドの呼出しによって配列が返される場合、readUnsharedはその配列のシャロー複製を返します。これにより、ベースとなるデータ・ストリームが処理されている場合でも、返される配列オブジェクトが一意であり、ObjectInputStreamに対するreadObjectまたはreadUnsharedの呼び出しから2回目には取得できないようになります。

      直列化復元フィルタは、nullでない場合、ルート・オブジェクトを再構築するために各オブジェクト(レギュラまたはクラス)読取りに対して呼び出されます。 詳細については、setObjectInputFilterを参照してください。

      このメソッドをオーバーライドするObjectInputStreamサブクラスは、SerializablePermission("enableSubclassImplementation")を持つセキュリティ・コンテキスト内だけで構築できます。このアクセス権を持たないセキュリティ・コンテキストでインスタンス化しようとすると、SecurityExceptionがスローされます。

      戻り値:
      直列化復元オブジェクトへの参照
      例外:
      ClassNotFoundException - 直列化復元するオブジェクトのクラスが見つからなかった場合
      StreamCorruptedException - ストリームの制御情報に一貫性がない場合
      ObjectStreamException - 直列化復元するオブジェクトがすでにストリーム内にあった場合
      OptionalDataException - ストリーム内の次のデータがプリミティブの場合
      IOException - 直列化復元中に入出力エラーが発生した場合
      導入されたバージョン:
      1.4
    • defaultReadObject

      public void defaultReadObject() throws IOException, ClassNotFoundException
      現在のクラスの非staticおよび非transientフィールドを、このストリームから読み込みます。 このメソッドを呼び出すことができるのは、直列化復元されているクラスのreadObjectメソッドだけです。 別の方法で呼び出された場合はNotActiveExceptionをスローします。
      例外:
      ClassNotFoundException - 直列化されたオブジェクトのクラスが見つからなかった場合。
      IOException - 入出力エラーが発生した場合。
      NotActiveException - ストリームが現在オブジェクトを読み込んでいない場合。
    • readFields

      ストリームから持続フィールドを読み込み、それらを名前を指定してアクセスできるようにします。
      戻り値:
      直列化復元されているオブジェクトの持続フィールドを表すGetFieldオブジェクト
      例外:
      ClassNotFoundException - 直列化されたオブジェクトのクラスが見つからなかった場合。
      IOException - 入出力エラーが発生した場合。
      NotActiveException - ストリームが現在オブジェクトを読み込んでいない場合。
      導入されたバージョン:
      1.2
    • registerValidation

      public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException
      オブジェクト・グラフが返される前に検証されるべきオブジェクトを登録します。 resolveObjectに似ていますが、これらの検証はオブジェクト・グラフ全体が再構築されたあとに呼び出される点が異なります。 通常、readObjectメソッドは、ストリームとともにオブジェクトを登録し、それによってオブジェクトのすべてが復元されたときに最終的な検証を実行できるようにします。
      パラメータ:
      obj - 検証のコールバックを受け取るオブジェクト。
      prio - コールバックの順序を制御する値。0が適切なデフォルト値である。 早くコールバックする場合は大きい番号を、あとでコールバックする場合は小さい番号を使う。 同じ優先順位内では、コールバックの処理に特別な順序はない。
      例外:
      NotActiveException - ストリームが現在オブジェクトを読み込んでいないため、コールバックを登録できない場合。
      InvalidObjectException - 検証オブジェクトがnullである場合。
    • resolveClass

      protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException
      指定されたストリーム・クラスの記述に対応するローカル・クラスをロードします。 サブクラスは、このメソッドを実装して、クラスを代替ソースから取得できるようにすることができます。

      ObjectOutputStream内で対応するメソッドはannotateClassです。 このメソッドは、ストリームの一意のクラスそれぞれについて1回だけ呼び出されます。 このメソッドは、代替のロード・メカニズムを使用するためにサブクラスによって実装することができますが、Classオブジェクトを返す必要があります。 返されたクラスが配列クラスでない場合は、そのserialVersionUIDが、直列化されたクラスのserialVersionUIDと比較されます。不一致がある場合、直列化復元が失敗し、InvalidClassExceptionがスローされます。

      ObjectInputStream内のこのメソッドのデフォルト実装は、次の呼出しの結果を返します

           Class.forName(desc.getName(), false, loader)
       
      ここで、loaderは、現在のスレッド・スタック(現在実行中のメソッドから開始)上の「プラットフォーム・クラス・ローダー」もその祖先でもない最初のクラス・ローダーです。それ以外の場合、loader「プラットフォーム・クラス・ローダー」です。 この呼出しの結果がClassNotFoundExceptionで、渡されたObjectStreamClassインスタンスの名前がプリミティブ型またはvoidに対するJava言語のキーワードである場合は、そのプリミティブ型またはvoidを表すClassオブジェクトが返されます。たとえば、"int"という名前のObjectStreamClassInteger.TYPEに解決されます。 そうでない場合は、このメソッドの呼出し側にClassNotFoundExceptionがスローされます。

      パラメータ:
      desc - ObjectStreamClassクラスのインスタンス
      戻り値:
      descに対応するClassオブジェクト
      例外:
      IOException - 通常の入出力関連の例外が発生した場合。
      ClassNotFoundException - 直列化されたオブジェクトのクラスが見つからなかった場合。
    • resolveProxyClass

      protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException
      プロキシ・クラス記述子で指定されたインタフェースを実装するプロキシ・クラスを返します。サブクラスはこのメソッドを実装してダイナミック・プロキシ・クラスの記述子とともにストリームからカスタム・データを読み込み、インタフェースやプロキシ・クラスの代替ローディング・メカニズムを使用できるようにします。

      このメソッドはストリームの一意の各プロキシ・クラス記述子について1回だけ呼び出されます。

      ObjectOutputStream内で対応するメソッドはannotateProxyClassです。 このメソッドをオーバーライドするObjectInputStreamの指定されたサブクラスについては、ObjectOutputStream内の対応するサブクラスのannotateProxyClassメソッドが、このメソッドが読み込むデータまたはオブジェクトをすべて書き込む必要があります。

      ObjectInputStream内のこのメソッドのデフォルト実装は、interfacesパラメータに指定されたインタフェースに対するClassオブジェクトのリストを使用してProxy.getProxyClassを呼び出した結果を返します。 各インタフェース名iに対するClassオブジェクトは、次の呼出しによって返された値です。

           Class.forName(i, false, loader)
       
      ここで、loaderは、現在のスレッド・スタック(現在実行中のメソッドから開始)上の「プラットフォーム・クラス・ローダー」もその祖先でもない最初のクラス・ローダーです。それ以外の場合、loader「プラットフォーム・クラス・ローダー」です。 解決されたインタフェースのすべてがpublicである場合は、このloaderと同じ値がProxy.getProxyClassに渡されるクラス・ローダーにもなります。一方、publicでないインタフェースが存在する場合は、代わりにそれらのインタフェースのクラス・ローダーが渡されます。publicでないインタフェース・クラス・ローダーが複数検出された場合は、IllegalAccessErrorがスローされます。 Proxy.getProxyClassからIllegalArgumentExceptionがスローされると、resolveProxyClassはそのIllegalArgumentExceptionを含むClassNotFoundExceptionをスローします。

      パラメータ:
      interfaces - プロキシ・クラス記述子に直列化復元されたインタフェース名のリスト
      戻り値:
      指定されたインタフェースのプロキシ・クラス
      例外:
      IOException - ベースとなるInputStreamが例外をスローした場合
      ClassNotFoundException - プロキシ・クラスまたは指定されたインタフェースがどれも見つからなかった場合
      導入されたバージョン:
      1.3
      関連項目:
    • resolveObject

      protected Object resolveObject(Object obj) throws IOException
      このメソッドは、直列化復元の際に、ObjectInputStreamの信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。 オブジェクトの置換は、enableResolveObjectが呼び出されるまでは行えません。 enableResolveObjectメソッドは、オブジェクトの解決を要求しているストリームが信頼できるかどうかを調べます。 直列化可能オブジェクトへのすべての参照は、resolveObjectに渡されます。 オブジェクトのprivate状態が意図せずに公開されることがないように、resolveObjectを使うのは信頼できるストリームに限定されます。

      このメソッドは、オブジェクトが読み込まれたあと、readObjectから復帰する前に呼び出されます。 デフォルトのresolveObjectメソッドは、同じオブジェクトを返します。

      サブクラスは、オブジェクトを置換するとき、置換されたオブジェクトと、参照が格納される各フィールドとの互換性を保つようにする必要があります。 型がフィールドまたは配列要素の型のサブクラスでないオブジェクトは、例外を生成して直列化復元を中止し、オブジェクトの格納されません。

      このメソッドは、各オブジェクトが最初に検出されたときに1回だけ呼び出されます。 これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。

      パラメータ:
      obj - 置換されるオブジェクト
      戻り値:
      置換されたオブジェクト
      例外:
      IOException - 通常の入出力関連の例外が発生した場合。
    • enableResolveObject

      protected boolean enableResolveObject(boolean enable) throws SecurityException
      ストリームがストリームから読み込まれたオブジェクトの置換を行うことを可能にします。 有効にすると、resolveObject(java.lang.Object)メソッドが直列化復元されるすべてのオブジェクトに対して呼び出されます。

      オブジェクトの置換が現在有効ではなく、enableがtrueであり、セキュリティ・マネージャがインストールされている場合、このメソッドは、セキュリティ・マネージャcheckPermissionメソッドをSerializablePermission("enableSubstitution")アクセス権で最初に呼び出して、呼び出し側がストリームによるオブジェクトの置換ストリームから読み込みます。

      パラメータ:
      enable - 直列化復元される各オブジェクトについてresolveObjectの使用を有効にする場合はtrue
      戻り値:
      このメソッドが呼び出される前の設定
      例外:
      SecurityException - セキュリティ・マネージャが存在し、checkPermissionメソッドが、ストリームがストリームから読み取られたオブジェクトの置換を行うことを許可しない場合。
      関連項目:
    • readStreamHeader

      protected void readStreamHeader() throws IOException, StreamCorruptedException
      サブクラスが自身のストリーム・ヘッダーの読み込みと検証を行えるようにするために提供されています。 このメソッドは、マジック番号とバージョン番号を読み込みます。
      例外:
      IOException - ベースとなるInputStreamの読込み中に入出力エラーが発生した場合
      StreamCorruptedException - ストリームの制御情報に一貫性がない場合
    • readClassDescriptor

      protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
      直列化ストリームからクラス記述子を読み込みます。 このメソッドは、ObjectInputStreamが直列化ストリームの次のアイテムとしてクラス記述子を要求すると呼び出されます。 writeClassDescriptorメソッドをオーバーライドしたObjectOutputStreamのサブクラスによって標準ではない形式で書き込まれたクラス記述子に読み込むために、ObjectInputStreamのサブクラスがこのメソッドをオーバーライドすることがあります。 デフォルトでは、このメソッドはクラス記述子をオブジェクト直列化仕様に定義された形式で読み込みます。
      戻り値:
      読み込まれたクラス記述子
      例外:
      IOException - 入出力エラーが発生した場合。
      ClassNotFoundException - クラス記述子表現に使用した直列化されたオブジェクトのクラスが見つからなかった場合
      導入されたバージョン:
      1.3
      関連項目:
    • read

      public int read() throws IOException
      データのバイトを読み込みます。 このメソッドは、有効な入力がない場合はブロックします。
      定義:
      read、インタフェース: ObjectInput
      定義:
      read、クラス: InputStream
      戻り値:
      読み込まれたバイト。ストリームの終わりに達した場合は -1。
      例外:
      IOException - 入出力エラーが発生した場合。
    • read

      public int read(byte[] buf, int off, int len) throws IOException
      バイト配列に読み込みます。 このメソッドは、入力の一部が利用できるようになるまでブロックします。 バイトの長さを正確に読み込むには、java.io.DataInputStream.readFullyを使用してください。
      定義:
      read、インタフェース: ObjectInput
      オーバーライド:
      read、クラス: InputStream
      パラメータ:
      buf - データの読込み先のバッファ
      off - 転送先配列の開始オフセットbuf
      len - 読み込まれる最大バイト数
      戻り値:
      実際に読み込まれたバイト数。ストリームの終わりに達した場合は -1。
      例外:
      NullPointerException - bufnullの場合。
      IndexOutOfBoundsException - offが負の場合、lenは負であるか、またはlenbuf.length - offより大きい。
      IOException - 入出力エラーが発生した場合。
      関連項目:
    • available

      public int available() throws IOException
      ブロックせずに読み込むことができるバイト数を返します。
      定義:
      available、インタフェース: ObjectInput
      オーバーライド:
      available、クラス: InputStream
      戻り値:
      読込み可能なバイト数。
      例外:
      IOException - ベースとなるInputStreamの読込み中に入出力エラーが発生した場合
    • close

      public void close() throws IOException
      入力ストリームを閉じます。 ストリームに関連するすべてのリソースを解放するために呼び出す必要があります。
      定義:
      close、インタフェース: AutoCloseable
      定義:
      close、インタフェース: Closeable
      定義:
      close、インタフェース: ObjectInput
      オーバーライド:
      close、クラス: InputStream
      例外:
      IOException - 入出力エラーが発生した場合。
    • readBoolean

      public boolean readBoolean() throws IOException
      booleanを読み込みます。
      定義:
      readBoolean、インタフェース: DataInput
      戻り値:
      読み込まれるboolean値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readByte

      public byte readByte() throws IOException
      8ビットのバイトを読み込みます。
      定義:
      readByte、インタフェース: DataInput
      戻り値:
      読み込まれる8ビットのバイト値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readUnsignedByte

      public int readUnsignedByte() throws IOException
      符号なし8ビット・バイトを読み込みます。
      定義:
      readUnsignedByte、インタフェース: DataInput
      戻り値:
      読み込まれる8ビットのバイト値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readChar

      public char readChar() throws IOException
      16ビットのcharを読み込みます。
      定義:
      readChar、インタフェース: DataInput
      戻り値:
      読み込まれる16ビットのchar値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readShort

      public short readShort() throws IOException
      16ビットのshortを読み込みます。
      定義:
      readShort、インタフェース: DataInput
      戻り値:
      読み込まれる16ビットのshort値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readUnsignedShort

      public int readUnsignedShort() throws IOException
      符号なし16ビットのshortを読み込みます。
      定義:
      readUnsignedShort、インタフェース: DataInput
      戻り値:
      読み込まれる16ビットのshort値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readInt

      public int readInt() throws IOException
      32ビットのintを読み込みます。
      定義:
      readInt、インタフェース: DataInput
      戻り値:
      読み込まれる32ビットのint値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readLong

      public long readLong() throws IOException
      64ビットのlongを読み込みます。
      定義:
      readLong、インタフェース: DataInput
      戻り値:
      読み込まれる64ビットのlong値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readFloat

      public float readFloat() throws IOException
      32ビットのfloatを読み込みます。
      定義:
      readFloat、インタフェース: DataInput
      戻り値:
      読み込まれる32ビットのfloat値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readDouble

      public double readDouble() throws IOException
      64ビットのdoubleを読み込みます。
      定義:
      readDouble、インタフェース: DataInput
      戻り値:
      読み込まれる64ビットのdouble値。
      例外:
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readFully

      public void readFully(byte[] buf) throws IOException
      バイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。
      定義:
      readFully、インタフェース: DataInput
      パラメータ:
      buf - データの読込み先のバッファ
      例外:
      NullPointerException - bufnullである場合。
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • readFully

      public void readFully(byte[] buf, int off, int len) throws IOException
      バイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。
      定義:
      readFully、インタフェース: DataInput
      パラメータ:
      buf - データの読込み先のバッファ
      off - データ配列bufへの開始オフセット
      len - 読み込む最大バイト数
      例外:
      NullPointerException - bufnullである場合。
      IndexOutOfBoundsException - offが負の値の場合、lenが負の値の場合、あるいはlenbuf.length - offより大きい場合
      EOFException - ファイルの終わりに達した場合。
      IOException - ほかの入出力エラーが発生した場合。
    • skipBytes

      public int skipBytes(int len) throws IOException
      バイトをスキップします。
      定義:
      skipBytes、インタフェース: DataInput
      パラメータ:
      len - スキップするバイト数
      戻り値:
      実際にスキップされたバイト数。
      例外:
      IOException - 入出力エラーが発生した場合。
    • readLine

      @Deprecated public String readLine() throws IOException
      非推奨。
      このメソッドはバイトを正確に文字に変換しません。詳細および代替メソッドについてはDataInputStreamを参照してください。
      \n、\r、\r\n、またはEOFで終了する行を読み込みます。
      定義:
      readLine、インタフェース: DataInput
      戻り値:
      行の文字列のコピー。
      例外:
      IOException - ベースとなるInputStreamの読込み中に入出力エラーが発生した場合
    • readUTF

      public String readUTF() throws IOException
      修正UTF-8形式の文字列を読み込みます。
      定義:
      readUTF、インタフェース: DataInput
      戻り値:
      文字列。
      例外:
      IOException - ベースとなるInputStreamの読込み中に入出力エラーが発生した場合
      UTFDataFormatException - 読込みバイトが、有効な修正UTF-8形式でエンコードされた文字列以外であった場合
    • getObjectInputFilter

      public final ObjectInputFilter getObjectInputFilter()
      このストリームの直列化復元フィルタを返します。 フィルタは、constructorまたはsetObjectInputFilterの最新起動によるJVM-wide filter factoryの起動結果です。
      戻り値:
      ストリームの直列化復元フィルタ。nullの場合があります
      導入されたバージョン:
      9
    • setObjectInputFilter

      public final void setObjectInputFilter(ObjectInputFilter filter)
      ストリームの直列化復元フィルタを設定します。 直列化復元フィルタは、current filterおよびfilterパラメータを使用して「JVM全体のフィルタ・ファクトリ」を起動することで返されるフィルタに設定されます。 現在のフィルタは、「JVM全体のフィルタ・ファクトリ」を呼び出して「ObjectInputStreamコンストラクタ」に設定されており、nullである可能性があります。setObjectInputFilter(ObjectInputFilter)このメソッド} は、ストリームからオブジェクトを読み取る前に一度だけ呼び出すことができます(たとえば、readObject()またはreadUnshared()を呼び出します)。

      non-nullフィルタをnullフィルタに置換することはできません。 current filternon-nullの場合、フィルタ・ファクトリから返される値はnon-nullである必要があります。

      フィルタcheckInputメソッドは、ストリーム内の各クラスおよび参照に対して呼び出されます。 フィルタは、クラス、配列の長さ、参照の数、グラフの深さ、および入力ストリームのサイズのいずれかまたはすべてをチェックできます。 深さは、直列化復元されるグラフのルートの読み込みから始まり、現在のオブジェクトを直列化復元しているネストされたreadObject呼び出しの数です。 参照の数は、現在のオブジェクトが読み込まれていることを含めて、ストリームからすでに読み込まれたオブジェクトへの参照および累積数です。 フィルタは、プリミティブではなく、ストリームからオブジェクトを読み取る場合にのみ呼び出されます。

      フィルタがStatus.REJECTEDnullを返すか、RuntimeExceptionをスローすると、アクティブなreadObjectまたはreadUnsharedInvalidClassExceptionをスローします。そうでない場合は、直列化復元は中断されません。

      実装要件:
      ストリーム内の各オブジェクト(レギュラまたはクラス)に対して、nullではなく、フィルタがreadObjectおよびreadUnsharedの間に呼び出されます。 文字列はプリミティブとして扱われ、フィルタは呼び出されません。 フィルタは次の目的で呼び出されます:
      • 各オブジェクト参照はストリーム(クラスはnull、arrayLengthは -1)から以前に直列化復元され、
      • 各正規のクラス(クラスはnullではなく、arrayLengthは -1です。)、
      • ストリーム(ストリーム内のクラスによって実装されるインタフェースに対してコールされません)で明示的に参照される各インタフェース・クラス
      • 動的プロキシの各インタフェースと動的プロキシ・クラス自体(クラスはnullではなく、arrayLengthは -1です。)、
      • 各配列は、配列の型と長さ(classは配列型、arrayLengthはリクエストされた長さです)を使用してフィルタリングされ、
      • クラスのreadResolveメソッドで置き換えられた各オブジェクトは、nullではなく、置換オブジェクト・クラスを使用してフィルタリングされ、配列の場合はarrayLength、そうでない場合は -1、
      • resolveObjectで置き換えられた各オブジェクトは、nullでない場合は置換オブジェクト・クラスを使用してフィルタリングされ、配列の場合はarrayLength、そうでない場合は -1にフィルタリングされます。
      checkInputメソッドが呼び出されると、現在のクラス、配列の長さ、ストリームからすでに読み込まれている参照の現在の数、readObjectまたはreadUnsharedへのネストされた呼び出しの深さ、および実装の依存バイト数入力ストリーム。

      readObjectまたはreadUnsharedを呼び出すごとに、オブジェクトを読み込む前に深さが1ずつ増加し、通常または例外的に戻る前に1ずつ減少します。 深さは1から始まり、各ネストされたオブジェクトに対して増加し、各ネストされたコールが戻ると減少します。 ストリーム内の参照数は1から始まり、オブジェクトを読み取る前に増加します。

      パラメータ:
      filter - フィルタはnullの場合があります
      例外:
      SecurityException - セキュリティ・マネージャが存在し、SerializablePermission("serialFilter")が付与されていない場合
      IllegalStateException - オブジェクトが読み取られた場合、current filterがnullでないときにフィルタ・ファクトリがnullを返すか、フィルタがすでに設定されている場合。
      導入されたバージョン:
      9