2011-01-27 23 views
16
public class MyObj implements Serializable { 
    private transient Map<String, Object> myHash = new HashMap<String, Object>(); 
    ... 
} 

有什麼辦法,以確保當上面的類的對象進行反序列化的成員myHash將被設置爲一個新的空地圖,而不是被設置爲null?反序列化對象的瞬態成員的非空默認在Java中

+0

它是不是已經設置了默認值?這是單身課嗎? – fmucar 2011-01-27 00:07:52

+3

@fatih反序列化不會調用您的構造函數或字段初始值設定項。這是一個重要的教訓,它可以節省您幾個小時的麻煩,調試似乎很好的代碼,突然停止工作。 – biziclop 2011-01-27 00:19:19

+1

它不會調用任何函數或構造函數,但它並沒有執行類範圍inited對象inits。每天學習新事物。謝謝。 – fmucar 2011-01-27 09:38:35

回答

28
public class MyObj implements Serializable { 
    private transient Map<String, Object> myHash = new HashMap<String, Object>(); 

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

     myHash = new HashMap<String, Object>(); 
    } 
} 
2

您可以實現自己的自定義readIn方法並明確創建一個新的Map<T>作爲Java Serializable documentation解釋。那篇文章應該描述如何去做你正在尋找的東西;檢查名爲的部分自定義默認協議

8

怎麼樣加入這樣的readObject方法:

public class MyObj implements Serializable { 
    private transient Map<String, Object> myHash = new HashMap<String, Object>(); 
    ... 
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
    in.defaultReadObject();  
    myHash = new HashMap<String, Object>(); 
    } 
} 

這應該排序你出去。

相關問題