2012-06-19 35 views
2

在什麼情況下,爲什麼應該考慮定製serialization流程? (下面的方法是將被JVM被調用的方法)Java:你想要什麼時候自定義序列化過程?

private void writeObject(java.io.ObjectOutputStream out){ 
     //customize serialization 
} 
private void readObject(java.io.ObjectInputStream in){ 
     //customize de-serialization 
} 

回答

0

,當你想你的子類無效serialization而超類是已經serializable我能想到的是唯一的原因,和那麼你可以簡單地在你的子類中的兩種方法中拋出異常。

我不確定是否有其他具體原因。

+0

在什麼情況下,這將是明智的?我想不出爲什麼你想要使你實現的接口所需的方法無效。 –

+0

當您不想維護由可序列化接口實現自動維護的超類的狀態 – peter

+0

再次,在什麼情況下,這是可取的。如果超級類是可序列化的,那大概是有原因的?如果您否定了預期的功能,那麼您不會對所述簽名的合同進行編碼。這是要求錯誤和錯誤的代碼。 –

2

「自定義默認協議」讀取甲dvanced Serialization自SUN

  1. 一個常見原因重寫readObjectwriteObject是序列爲一個超類不是Serializable數據本身。
  2. 驗證流
  3. 加密序列化對象
2

我想某些情況下,您可能希望控制序列化:

  • 當你要加密和解密後的序列化的數據。
  • 您也可能希望用戶或其他應用程序修改對象的序列化形式,以便在這種情況下您可能需要編寫更人性化的東西。
  • 如果您通過網絡傳輸數據,您可能需要修改數據,以便對方的程序可以理解它。

這些是我現在可以想到的原因。

希望它有幫助。

0

另一個很重要的原因是當你想減少獲得序列化的數據量。舉例來說,一個容量爲1024的HashMap。假設目前它只有3個條目。序列化一個1024的數組將是非常浪費的,當它需要做的就是序列化三個條目。如果你要序列化的對象引用了不可序列化的服務,你應該首先將這些成員標記爲transient(以防止序列化),但是然後使用writeObject捕獲足夠的信息以便readObject可以在反序列化時重新建立參考。

+0

要清楚,HashMap已經做了描述這裏。 – EJP

1

自定義序列化的好處之一是可以添加瞬態字段(如從其他類繼承)到序列化過程中。你可以這樣做

class NotMyClass implements Serializable { 
    String login; 
    transient String password; 
    //...  
} 

//I want to serialize also transient password field 
class MyClass extends NotMyClass { 

    private void writeObject(ObjectOutputStream out) throws IOException { 
     System.out.println("defaul serialization"); 
     out.defaultWriteObject(); 

     System.out.println("my serialization >>>> adding inherited transient value"); 
     out.writeObject(password); 
    } 

    private void readObject(ObjectInputStream in) throws IOException, 
      ClassNotFoundException { 
     System.out.println("defaul deserialization"); 
     in.defaultReadObject(); 
     System.out.println("my deserialization <<<< reading stored transient value"); 
     password = (String) in.readObject(); 
    } 
} 
相關問題