反序列化对象的瞬态成员的非空默认在Java中

问题描述:

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

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>(); 
    } 
} 

您可以实现自己的自定义readIn方法并明确创建一个新的Map<T>作为Java Serializable documentation解释。那篇文章应该描述如何去做你正在寻找的东西;检查名为的部分自定义默认协议

怎么样加入这样的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>(); 
    } 
} 

这应该排序你出去。