2011-05-06 50 views
6

我正在通過this article來了解有關Java序列化過程的更多信息。當涉及到的readObject/writeObject用途,我可以看到兩個用例:序列化中readObject/writeObject的使用

  1. 我們可以使用writeObject加密字節碼就被序列化之前。從安全角度來看,這是件好事。
  2. 我們可以使用readObject來執行任何需要在反序列化後立即執行的特定代碼段,並且從第1個點開始,我們甚至可以使用readObject來解密序列化對象時被排除的字節代碼。

有沒有您遇到在序列化/寫customr的readObject/writeObject方法反序列化對象的任何其他實際情況?或者如果你可以指向任何可以看到readObject/writeObject體面和實用的地方?

+3

請更新文章鏈接。 – 2013-01-02 23:26:37

回答

11

自定義readObject方法在對象被反序列化後需要初始化瞬態(非序列化)字段時也很有用。


BTW,檢查Effective Java, Chapter 11(我不知道該章節/項目數是在第二版的內容。)。這是一個很好的序列化閱讀。

+4

'readResolve()'也可用於此目的。 – biziclop 2011-05-06 13:10:09

+0

其實它...我正在尋找一些關於它在您的應用程序中的使用情況的評論。雖然自定義序列化是一件奇特的事情,但是在readObject()中初始化瞬態或靜態變量是經常使用的功能。 – Vicky 2011-05-06 15:55:44

+0

@Vicky:「實際上它確實」,有效的Java鏈接回答你的問題? – 2011-05-06 16:03:36

4

有可能是使用自定義序列幾個原因:

  1. 性能。
  2. 與外部系統接口。 (超越你的範圍或甚至是非Java系統。)
  3. 需要一種人類可讀的格式。
  4. 支持舊版本的序列化類。

僅舉幾例,但我相信還有更多。

3

解密事情可以通過使用基於CipherOutputsStream的ObjectOutputStream更好地完成。

writeObject/readObject最重要的用途是如果你想保持序列化穩定在多個代碼修訂版上。您的內部表示(成員變量)可能會更改,但序列化必須穩定,因爲您有舊系統與之通信(例如,通過讀取文件中的舊數據)。

但是我更喜歡這些情況下的Externalizable接口,因爲它更易於使用(沒有隱式調用和只有jvm知道的方法)。

+0

這就是爲什麼(例如)[Java的LinkedList實現](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/LinkedList .java#LinkedList.writeObject%28java.io.ObjectOutputStream%29)實現了writeObject/readObject方法? – 2017-12-12 08:03:15

2
public class Employee implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private int empno; 
    private String ename; 
    private String job; 

    // setter & getter 

    @Override 
    public String toString() { 
     return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job 
       + "]"; 
    } 

    private void writeObject(ObjectOutputStream out) throws IOException { 

     // default serialization 
     // out.defaultWriteObject(); 

     // custom serialization 
     out.writeInt(empno); 
     out.writeUTF(ename); 
     // out.writeUTF(job); //job will not serialize 
    } 

    private void readObject(ObjectInputStream in) throws IOException, 
      ClassNotFoundException { 

     // default deSerialization 
     // in.defaultReadObject(); 

     // custom deSerialization 
     empno = in.readInt(); 
     ename = in.readUTF(); 
     // this.job = in.readUTF(); 
    } 

}