【发布时间】: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