反序列化对象的瞬态成员的非空默认在Java中
问题描述:
public class MyObj implements Serializable {
private transient Map<String, Object> myHash = new HashMap<String, Object>();
...
}
有什么办法,以确保当上面的类的对象进行反序列化的成员myHash将被设置为一个新的空地图,而不是被设置为null?反序列化对象的瞬态成员的非空默认在Java中
答
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>();
}
}
这应该排序你出去。
它是不是已经设置了默认值?这是单身课吗? – fmucar 2011-01-27 00:07:52
@fatih反序列化不会调用您的构造函数或字段初始值设定项。这是一个重要的教训,它可以节省您几个小时的麻烦,调试似乎很好的代码,突然停止工作。 – biziclop 2011-01-27 00:19:19
它不会调用任何函数或构造函数,但它并没有执行类范围inited对象inits。每天学习新事物。谢谢。 – fmucar 2011-01-27 09:38:35