1

readObjectNoData()/writeReplace()/readResolve()シリアル化/逆シリアル化プロセス中に、デフォルトのシリアル化/逆シリアル化の動作をカスタマイズするように定義できます。

今私の質問は、どこで宣言されているのかということです。LikereadUnshared()/writeUnshared() はで宣言/定義されてい ObjectInputStream/ObjectOutputStreamます。

4

3 に答える 3

2

これらはどのインターフェースでも宣言されていません。これは言語外の契約です。SerializableJavaシリアル化メカニズムのコントラクトによってそれを実装するクラスをバインドするマーカーインターフェイスです。ベストプラクティスは、を宣言することprivate readResolveです。これにより、それを宣言するインターフェイスが存在しない可能性があることが非常に明確になります。

于 2013-01-02T12:05:22.783 に答える
2

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;

于 2013-01-03T05:16:43.173 に答える
1

シリアル化メカニズムは、リフレクションを使用してこれらのフィールドを呼び出します。検出はメソッドシグネチャに基づいており、これらのインターフェイスはありません。

于 2013-01-02T12:08:52.507 に答える