クラスとしてのカスタム・フィルタの設定

カスタム・フィルタは、java.io.ObjectInputFilterインタフェースを実装するクラス、ラムダ式またはメソッドとして実装できます。

通常、フィルタはステートレスで、入力パラメータに対してのみチェックを実行します。ただし、たとえば、ストリーム内のアーティファクトをカウントするcheckInputメソッドへの呼出し間の状態を維持するフィルタを実装できます。

次の例では、FilterNumberクラスはNumberクラスのインスタンスであるオブジェクトを許可し、その他すべてを拒否します。

    class FilterNumber implements ObjectInputFilter {
        public Status checkInput(FilterInfo filterInfo) {
            Class<?> clazz = filterInfo.serialClass();
            if (clazz != null) {
                return (Number.class.isAssignableFrom(clazz))
                    ? ObjectInputFilter.Status.ALLOWED
                    : ObjectInputFilter.Status.REJECTED;
            }
            return ObjectInputFilter.Status.UNDECIDED;
        }
    }

この例では:

  • checkInputメソッドはObjectInputFilter.FilterInfoオブジェクトを受け入れます。オブジェクトのメソッドは、チェック対象のクラス、配列サイズを、現在の深さ、既存のオブジェクトへの参照の数およびこれまでに読み取られたストリーム・サイズへのアクセスを提供します。
  • serialClassがnullでない場合は、値がチェックされて、オブジェクトのクラスがNumberであるかどうかが確認されます。その場合は、受け入れられ、ObjectInputFilter.Status.ALLOWEDが返されます。それ以外の場合は、拒否され、ObjectInputFilter.Status.REJECTEDが返されます。
  • 引数のその他の組合せでは、ObjectInputFilter.Status.UNDECIDEDが返されます。デシリアライズは続行され、オブジェクトが受け入れられるか拒否されるまで、残りのフィルタが実行されます。他のフィルタがない場合、オブジェクトは受け入れられています。