0

質問が言ったように、JVM は Marker インターフェイスを実装するクラスに特別な扱いをします。たとえば、以下のように Serializable を使用してテストしました。

java.io.* をインポートします。

public class SerialazationDemo {
    public static void main(String[] args) {
        //serialized object
/*      Employee e = new Employee();
        e.name = "Reyan Ali";
        e.address = "Phokka Kuan, Ambehta Peer";
        e.SSN = 11122333;
        e.number = 101;
        try {
            FileOutputStream fileOut = new FileOutputStream("E:\\temp\\employee.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(e);
            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in /tmp/employee.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }*/

        //deserialized object
         Employee e = null;
          try
          {
             FileInputStream fileIn = new FileInputStream("E:\\temp\\employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             e = (Employee) in.readObject();
             in.close();
             fileIn.close();
          }catch(IOException i)
          {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c)
          {
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
          }
          System.out.println("Deserialized Employee...");
          System.out.println("Name: " + e.name);
          System.out.println("Address: " + e.address);
          System.out.println("SSN: " + e.SSN);
          System.out.println("Number: " + e.number);
    }
}

class Employee {
    public String name;
    public String address;
    public transient int SSN;
    public int number;

    public void mailCheck() {
        System.out.println("Mailing a check to " + name + " " + address);
    }
}

そして、jvm が java.io.NotSerializableException として例外を与えることがわかりましたが、FILES は指定されたパスに作成されました。逆シリアル化の同様の例外です。では、JVM がシリアル化する必要があるのはなぜですか。シリアル化を直接作成できる可能性があります。

4

4 に答える 4

0

マーカー インターフェイスとは

インターフェースは、実行時にクラスに特別な動作を提供できるようにクラスをマークするために Java インタープリターによってハンドルとして提供され、メソッド宣言を持たない場合、マーカー インターフェースと呼ばれます。

マーカー インターフェイスは、クラスを特定の型としてマークするだけです。

マーカー インターフェイスが必要な理由

マーカー インターフェイスは、Java コンパイラにメッセージを通知するタグとして使用されます。これにより、Java コンパイラは、それを実装するクラスに特別な動作を追加できます。そのため、JVM がクラスがシリアライズ可能であることを確認すると、特別な操作が行われます。

Serialiize InterfaceでJVMは何をしますか?

クラスがシリアライズ可能なインターフェースを実装すると、このクラスが実行時に特別な動作 (シリアライゼーション/デシリアライゼーション) を提供できることが JVM に保証されます。

したがって、オブジェクトをシリアル化しようとすると、JVM は、このタイプのオブジェクトのクラスが実行時にこの特別な動作を示す契約を作成したかどうか (シリアル化インターフェイスの実装) を確認したい (シリアル化/逆シリアル化される)。実装されている場合、JVMそれ以外の場合は、シリアライゼーションまたはデシリアライゼーションの準備ができているという条件に同意しないオブジェクトをシリアライズしようとしているという例外がスローされます。

于 2014-08-08T05:03:33.687 に答える