【问题标题】:Deserialize a transient member of an object to a non-null default in Java在Java中将对象的瞬态成员反序列化为非空默认值
【发布时间】:2011-01-27 00:04:14
【问题描述】:
public class MyObj implements Serializable {
  private transient Map<String, Object> myHash = new HashMap<String, Object>();
  ...
}

有什么方法可以保证当上述类的对象被反序列化时,成员myHash会被设置为一个新的空Map而不是设置为null?

【问题讨论】:

  • 不是已经设置默认值了吗?这是单例类吗?
  • @fatih 反序列化不会调用您的构造函数或字段初始值设定项。这是一个重要的教训,它可以为您节省数小时的麻烦,调试看似好的代码,但突然停止工作。
  • 它不会调用任何函数或构造函数,但显然它也没有执行类范围初始化的对象初始化。每天学习新事物。谢谢。

标签: java serialization


【解决方案1】:
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】:

像这样添加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>();
  }
}

这应该可以解决您的问题。

【讨论】:

    【解决方案3】:

    您可以实现自己的自定义readIn 方法并显式创建一个新的Map&lt;T&gt;,如Java Serializable documentation 中所述。那篇文章应该描述如何做你正在寻找的东西;检查标题为自定义默认协议的部分。

    【讨论】:

    • 那个链接失效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多