2

Javaシリアル化に関するいくつかの資料を読んでいますが、自己定義型の場合、型に2つのメンバー関数を定義して、デフォルトのシリアル化動作を変更できることがわかりました。

private void readObject(java.io.ObjectInputStream in)
private void writeObject(java.io.ObjectOutputStream out)

これについて2つの質問があり
ます。1。これら2つの関数はすべてprivateキーワードで修飾されていますが、シリアル化プロセス中にどのように呼び出されますか?
2. JavaSerializableインターフェイスが空のインターフェイスであることは誰もが知っていますが、シリアル化メカニズムは、これら2つの関数を呼び出してシリアル化と逆シリアル化することをどのように認識しますか?

お役に立てることを楽しみにしています!

チェン

4

2 に答える 2

3

これらの2つの関数はすべてプライベートキーワードで修飾されていますが、シリアル化プロセス中にどのように呼び出されますか?

基本的に、Javaのシリアル化にはJVMの魔法が含まれます。ええと、コンストラクターを呼び出さずにオブジェクトを作成することも含まれます。

Java Serializable Interfaceが空のインターフェースであることは誰もが知っていますが、シリアル化メカニズムは、これら2つの関数を呼び出してシリアル化と逆シリアル化することをどのように知っているのでしょうか。

クラスがリフレクションを介して特定のメソッドを提供するかどうかを(適切に信頼されたコードから)簡単に見分けることができます。シリアル化フレームワークコードは、メソッドを呼び出すだけでなく、それを決定するために十分に信頼されています。

もちろん、通常のJavaでは、別のクラスからプライベートメソッドを検出して呼び出すだけで(ここでも、適切に信頼できるコードを使用して)実行できます。

import java.lang.reflect.*;

class Other {
    private static void privateMethod() {
        System.out.println("You can't call me, can you?");
    }
}

public class Test {
    public static void main (String[] args) throws Exception {
        Method method = Other.class.getDeclaredMethod("privateMethod");
        method.setAccessible(true);
        method.invoke(null);
    }
}
于 2012-06-25T06:07:33.563 に答える
1

両方の質問に対する答えは、これらはJava実装でハードコーディングされているため、「通常の」ルールは適用されないということです(これはおそらく少し矛盾しています)。

于 2012-06-25T06:07:55.243 に答える