【问题标题】:Serializing object that contains NotSerializableException objects序列化包含 NotSerializableException 对象的对象
【发布时间】:2016-04-14 00:22:02
【问题描述】:

我正在尝试保存帐户对象。它拥有多个不同的投资组合,每个投资组合都有许多不同的投资。每个投资都有一个使用 org.apache.commons.csv.CSVParser 的对象。当我去序列化帐户以便稍后加载它时,我得到了 java.io.NotSerializableException。

我不知道如何解决这个问题。

【问题讨论】:

  • I have no idea how to fix this. 如果不向我们展示一些代码,很难说,但是将您不想序列化的对象设为transient
  • 谢谢!这允许我序列化帐户对象。唯一的问题是,当我再次去加载账户obj时,所有的CSV数据都是空的。
  • 再次:如果不向我们展示一些代码,很难判断

标签: java csv serialization


【解决方案1】:

Investment 类中的 csv 解析器字段标记为 transient。此外,确保在反序列化后初始化瞬态 csv 解析器字段,方法是在您的 Investment 类中实现 readObject,这样它就不会给您一个 NullPointerException,以防该字段被取消引用反序列化后。您需要将具有以下签名的方法添加到您的 Investment 类:

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

并在其中正确初始化 csv 解析器。

请参阅this article about serialization in javajava serialization specification 了解更多详情。

【讨论】:

  • 好的,CSVParser 在我的 Investment 类的 Data 对象中。 Data 对象在 Investment 构造函数中初始化。我不确定如何在我的情况下实现 readObject() 。我需要在方法 readObject 中初始化 Data,然后将 readObject 放入我的构造函数中?
  • @jonbon 所以实际上是Data 对象持有对不可序列化CSVParser 的引用。如果Data 对象应该与对象图的其余部分一起序列化(当然不可序列化的CSVParser 除外),那么您应该将readObject 方法添加到Data 类中。从本质上讲,readObject 让您有机会自定义对象的反序列化。每当您需要处理不可序列化的字段时,您将有机会在反序列化时在readObject 中这样做。
  • 同样,实现writeObject 让您有机会自定义序列化。
猜你喜欢
  • 1970-01-01
  • 2011-01-01
  • 2014-07-10
  • 2011-12-02
  • 1970-01-01
  • 2012-03-12
  • 2018-03-20
相关资源
最近更新 更多