【问题标题】:Serialization with third party interface implementations in ArrayList在 ArrayList 中使用第三方接口实现进行序列化
【发布时间】:2015-11-17 10:09:12
【问题描述】:

我有一个 ArrayList,其中包含第三方接口的实现。这些实现不实现 java.io.Serializable 并且不可能让它们这样做。我确实看到您可以使 arrayList 瞬态,但不幸的是这没有效果。当读取 arrayList 我得到:

Caused by: java.io.NotSerializableException: progress.message.jimpl.xmessage.MultipartMessage
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.ArrayList.writeObject(ArrayList.java:762)

在哪里

progress.message.jimpl.xmessage.MultipartMessage extends progress.message.jimpl.Message implements progress.message.jclient.MultipartMessage

progress.message.jclient.MultipartMessage extends progress.message.jclient.Message 

这是 ArrayList 包含的内容。

有什么方法可以防止 NotSerializableException 的发生?

【问题讨论】:

  • 创建自己的包装类,它有一个MultipartMessage 并实现Serializable。将 List<MultipartMessage> 中的所有项目复制到 List<YourClass> 并将其写入流。
  • 问题在于 MultipartMessage 只是 ArrayList 可以包含的内容之一。它还可以包含 TextMessage、XmlMessage 等等。
  • 遗憾的是,如果您无法访问第三方对象的实例字段(其本身不可序列化),那么您将无法使 ArrayList 可序列化。如果您的 ArrayList 的组件类型允许许多实现,其中许多或全部是不可序列化的,则问题会更加复杂。
  • @Manu:将不可序列化的对象嵌入到包装类中,无论包装类是否可序列化,都不会使不可序列化的包装对象可序列化。
  • @scottb 如果不可能,有没有办法防止堆栈跟踪被打印?应用程序本身会处理此错误,但日志中会充满这些错误。

标签: java serialization arraylist


【解决方案1】:

【讨论】:

  • 看起来很不错。还不知道怎么用,希望能弄明白。
  • 好的,如果您需要帮助,请给我留言。如果答案对您有帮助,请不要忘记复选标记:-)
  • 我还没有找到如何使用它。你能告诉我如何开始吗?
  • 我通过过滤掉我的 log4j 配置中的异常来解决它。在这种情况下这就足够了。无论如何我都会标记你的答案,因为它可以解决问题。
【解决方案2】:

创建MultipartMessage 的子类并在其中实现Serializable,就像在ArrayList 中使用它一样。

public classs SerializableMultipartMessage extends MultipartMessage implements Serializable {

}

【讨论】:

  • 很遗憾,这是不可能的,因为 MultipartMessage 是从第三方的另一个类中的方法返回的。
  • 无论如何,只有当客户端可以访问超类实例字段并且超类具有无参数构造函数时,此解决方案才有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2020-04-14
  • 2014-05-23
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多