2014-12-23 29 views
1

我已閱讀以下文章:可串行化和可外部化。構造函數調用的差異,而反序列化

http://javapapers.com/core-java/externalizable-vs-serializable/

在對象反序列化(reconsturction)公共無參數的構造函數 用於重建的對象。在 序列化的情況下,代替使用構造,目的是從ObjectInputStream中讀 重新使用consturcted數據。
上述要點隨後要求Externalizable對象必須具有公共無參數構造函數。在 Seriablizable的情況下,它不是強制性的。

難道真相構造函數調用該

Serializable接口:
雖然反序列化調用最近的非Serializable祖先的構造函數只有

外部化:
雖然反序列化調用類的構造函數僅實現Externalizable接口。

+0

忽略任意互聯網垃圾並直接進入對象序列化規範,該規範與您的斷言一致。 – EJP

回答

1

是,在字節代碼,你可以創建一個對象的實例,並調用層次結構中的任何構造。實際上,構造函數是一種特殊的方法,甚至可以多次調用它。

許多解串器只需使用Unsafe.allocateInstance()和不調用任何構造函數。這是爲了儘量減少反序列化時的副作用。在Externalizable接口的情況下

1

反序列化過程依賴於通過構造函數,我們明確地創建它的對象,但在Serializable接口的情況下,物體得到由ObjectStreamClass.newInstance()創建的。所以這裏沒有構造函數的作用。

在此之後,它在內部存儲,其與通過InputStream對象鏈接的數據/對象(任何自定義字段,字符串,整數...等)的陣列。所有數組元素(存儲對象的狀態)稍後將設置到對象中,並且它將返回到系統。

此外,我想告訴你,有沒有強制性的有外部化的情況下,無參數的構造函數。我們可以通過在構造函數初始化時將所有參數傳遞爲null來創建對象,並且可以正常工作。

ExternalizablePair1 copyOfPair = new ExternalizablePair1(null,null,null); 

    FileInputStream inputStream = new FileInputStream(OUTPUT_FILE); 
    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); 
    copyOfPair.readExternal(objectInputStream); 

     @Override 
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { 
    this.key = in.readUTF(); 
    this.value = in.readUTF(); 
    this.emp = (Employee) in.readObject(); 
} 
相關問題