未知类的 java.io.NotSerializableException

Posted

技术标签:

【中文标题】未知类的 java.io.NotSerializableException【英文标题】:java.io.NotSerializableException for unknown classes 【发布时间】:2015-09-15 08:14:56 【问题描述】:

我正在尝试使我的课程可序列化。我所有的类都是,但它仍然会抛出 NotSerializableException 对于我找不到它的用法的其他一些类(例如 com.sun.java.swing.plaf.windows.XPStyle、WClipboard)。

在序列化或使它们可序列化时,我可以做什么以及如何绕过这些类?

已解决

问题在于我在 JFrames 和 JDialogs 中使用的 LookAndFeel(XPStyle 的问题)。第二个(WClipboard),它被我从这里得到的第三方类使用。此类使用剪贴板。

我创建了剪贴板字段 transient 和 LookAndFeel,我无法管理,只是将其删除。

【问题讨论】:

一般来说,与 UI 关联的类(如 XPStyle 和 WClipboard)是故意不可序列化的,因为它们可以与无法序列化的操作系统特定(即本机)对象交互。 当您使用可序列化并且嵌套在扩展 Swing 组件的类中的内部类时,通常会出现这种情况。内部类与自身一起序列化外部类,即使这不是您的意图。解决方案:静态。 请看我在下一个答案中的评论。我知道原因但不知道解决方案:-) 【参考方案1】:

如果您不希望数据被序列化以进行持久化或传输,则可以声明那些transient

但是,如果您需要将这些对象(类)中的数据持久化,通过 TCP/UDP 等进行传输,那么您可能希望extend 类,并实现您自己的解释,以便您然后可以声明你的扩展类Serializable


最后的选择可能是使用 Serialization 的不同方法,例如 FSTKryo 等提供的方法。这些序列化库通常可以使用Reflection 用于序列化默认 Java 实现不能的对象。

【讨论】:

我根本不知道谁在使用这个类。我知道,我会做一些建议的事情,但是当我从未导入(甚至直接)这些类中的任何一个时,如何使它成为瞬态或扩展它? 离开您发布的内容,com.sun.java.swing.plaf.windows.XPStyle 是一种样式,您很可能在启动时在 init() 或主类中为您的 Swing JFrame 应用该样式。您最好的选择是查找并确定设置此样式的位置,并确保在设置样式之前没有创建对象。如果您正在创建一个对象,则需要将其标记为瞬态。否则,前面所说的可能是您最好的选择:将其设为静态。

以上是关于未知类的 java.io.NotSerializableException的主要内容,如果未能解决你的问题,请参考以下文章

如何处理语义分割中未知类的平均交集(mIOU)?

创建未知类的对象(两个继承的类)

未知类的 java.io.NotSerializableException

来自符合协议的未知类的 Swift init

将未知类的成员函数连接到增强信号

JavaScript获取未知类的结构