[英]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.