readObjectNoData()/writeReplace()/readResolve()
シリアル化/逆シリアル化プロセス中に、デフォルトのシリアル化/逆シリアル化の動作をカスタマイズするように定義できます。
今私の質問は、どこで宣言されているのかということです。LikereadUnshared()/writeUnshared()
はで宣言/定義されてい ObjectInputStream/ObjectOutputStream
ます。
これらはどのインターフェースでも宣言されていません。これは言語外の契約です。Serializable
Javaシリアル化メカニズムのコントラクトによってそれを実装するクラスをバインドするマーカーインターフェイスです。ベストプラクティスは、を宣言することprivate readResolve
です。これにより、それを宣言するインターフェイスが存在しない可能性があることが非常に明確になります。
InObjectStreamClass hasReadObjectNoDataMethod()/hasReadResolveMethod()/hasWriteReplaceMethod()
メソッドは、ターゲットクラスがメソッドを定義するかどうかを識別するために使用されるdefineです。定義するreadObjectNoData()/writeReplace()/readResolve()
場合、それらのメソッドはで呼び出されます。ObjectInputStream/ObjectOutputStream.
ObjectInputStream.readSerialData(....
if (obj != null &&
slotDesc.hasReadObjectNoDataMethod() &&
handles.lookupException(passHandle) == null)
{
slotDesc.invokeReadObjectNoData(obj);
}
ObjectStreamClass
次のフィールドも宣言します private Method readObjectNoDataMethod;private Method writeReplaceMethod;private Method readResolveMethod;
シリアル化メカニズムは、リフレクションを使用してこれらのフィールドを呼び出します。検出はメソッドシグネチャに基づいており、これらのインターフェイスはありません。