簡體   English   中英

jvm在Java中如何使用標記接口

[英]what jvm do with marker interface in java

有人問,什么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要求將其序列化,它可以直接允許創建序列化。

問題說什么JVM對實現Marker接口的類給予額外的待遇

這個問題的正確答案是什么。 但這可能需要消除,因為發問者可能不精確地使用術語。

JRE在適當的地方特別對待它們。 此操作位於Java類庫中,而不在JVM中。 例如:

  • Object.clone()測試對象是否實現了Cloneable.
  • ObjectOutputStream.writeObject()測試要寫入的對象是否實現了Serializable.
  • rmic和RMI運行時的一部分測試了遠程對象實現了遠程接口,這意味着擴展了Remote.的接口Remote.

這與JVM 本身無關

我發現jvm將異常作為java.io.NotSerializableException

不,你沒有。 您發現ObjectOutputStream.writeObject()引發了異常。 這不是同一回事。

但是文件是在給定的路徑上創建的

該文件是由new FileOutputStream(...),創建的,該文件已在獲取異常之前執行。

那么為什么JVM要求將其序列化,它可以直接允許創建序列化。

沒有。 往上看。 但是ObjectOutputStream.writeObject()確實如此,因為這樣做是因為使一切可Serializable都具有許多缺點,在建議它之前,需要加以考慮。 例如,考慮您不希望使用的可序列化密碼字段的安全風險。

你需要延長的原因Serializable (或Externalizable )是為了確保你只連載而設計的序列化類。 您當然不希望序列化未為其設計的類,因為那樣的話,它們的格式將非常脆弱。 對課程的最小更改會破壞您的反序列化。

有人可能會說同樣的脆弱性適用於類標記Serializable ,但你應該標記一個類時,考慮串行形式穩定性Serializable (或者明確地否認任何穩定性,番石榴一樣)。

如果對象不可Serializable則無法使用ObjectOutputStrem保存其狀態。

必須創建文件,因為這是使用FileInputStream完成的,一旦關閉流,就會有一個新文件。 但是,如果嘗試檢查文件的內容,則該文件應該為空,因為將無法保存不可序列化狀態。

什么是標記接口?

當接口由java解釋器提供為標記類的句柄時,該接口稱為標記接口,以便它可以在運行時為其提供特殊行為,並且它們沒有任何方法聲明

標記接口只是將類標記為特定類型。

為什么需要標記界面?

Marker接口用作標記,以將消息通知給Java編譯器,以便它可以為實現它的類添加特殊行為。因此,如果JVM看到Class是可序列化的,它將對其執行一些特殊操作

什么JVM與Serialiize Interface一起使用?

當一個類實現可序列化的接口時,它將向JVM保證該類可以在運行時提供特殊的行為(Serialization / Deserialization)。

因此,當您嘗試序列化對象時,JVM希望確認此類型的對象類是否已簽約(實現序列化接口)以在運行時顯示此特殊行為(要序列化/反序列化)。如果已實現,則JVM確保它可以繼續進行序列化,否則會拋出異常,即您試圖序列化一個對象,該對象與准備好序列化或反序列化的條款和條件不一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM