クラスとしてのカスタム・フィルタの設定
カスタム・フィルタは、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
が返されます。デシリアライズは続行され、オブジェクトが受け入れられるか拒否されるまで、残りのフィルタが実行されます。他のフィルタがない場合、オブジェクトは受け入れられています。