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

クラスObjectInputStream

  • すべての実装されたインタフェース:
    Closeable, DataInput, ObjectInput, ObjectStreamConstants, AutoCloseable

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

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

    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上の「フィルタが設定されている」の場合、ObjectInputFilterは、クラス、配列の長さ、ストリーム内の参照数、入力ストリームから消費されたバイト数、許容されないバイト数を確認できます。そうでない場合は、直列化復元を終了できます。 「プロセス全体のフィルタ」は、setObjectInputFilterを使用して置き換えない限り、各ObjectInputStreamに適用されるように構成することができます。

    オブジェクトを直列化復元する間に発生したすべての例外は、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を持ちます。

    導入されたバージョン:
    1.1
    関連項目:
    DataInput, ObjectOutputStream, Serializable, 「オブジェクト直列化仕様」のセクション3「オブジェクト入力クラス」
    • コンストラクタの詳細

      • ObjectInputStream

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

        直列化フィルタは「プロセス全体のフィルタ」の値に初期化されます。

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

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

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

        直列化フィルタは「プロセス全体のフィルタ」の値に初期化されます。

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

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

      • readObject

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

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

        nullではなく、直列化フィルタが各オブジェクト(レギュラまたはクラス) readに対して呼び出され、ルート・オブジェクトが再構築されます。 詳細については、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
        関連項目:
        ObjectInputStream(), readObject()
      • 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ではなく、直列化フィルタが各オブジェクト(レギュラまたはクラス) readに対して呼び出され、ルート・オブジェクトが再構築されます。 詳細については、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

        public ObjectInputStream.GetField readFields()
                                              throws IOException,
                                                     ClassNotFoundException
        ストリームから持続フィールドを読み込み、それらを名前を指定してアクセスできるようにします。
        戻り値:
        直列化復元されているオブジェクトの持続フィールドを表す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
        関連項目:
        ObjectOutputStream.annotateProxyClass(Class)
      • 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メソッドが、ストリームがストリームから読み取られたオブジェクトの置換を行うことを許可しない場合。
        関連項目:
        SecurityManager.checkPermission(java.security.Permission)SerializablePermission
      • 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
        関連項目:
        ObjectOutputStream.writeClassDescriptor(java.io.ObjectStreamClass)
      • 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 - 入出力エラーが発生した場合。
        関連項目:
        DataInputStream.readFully(byte[],int,int)
      • 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()
        このストリームの直列化フィルタを返します。 直列化フィルタは、setObjectInputFilterの最新のフィルタ・セットまたはObjectInputFilter.Config.getSerialFilterの初期プロセス全体のフィルタです。
        戻り値:
        ストリームの直列化フィルタnullの場合がある
        導入されたバージョン:
        9
      • setObjectInputFilter

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

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

        ObjectInputStreamが構築されたときに、直列化フィルタはObjectInputFilter.Config.getSerialFilterの値に初期化され、カスタム・フィルタに一度しか設定できません。

        実装要件:
        ストリーム内の各オブジェクト(レギュラまたはクラス)に対して、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 - 「現在のフィルタ」nullでなく、プロセス全体のフィルタでない場合
        導入されたバージョン:
        9