【问题标题】:java.io.NotSerializableException for unknown classes未知类的 java.io.NotSerializableException
【发布时间】: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 组件的类中的内部类时,通常会出现这种情况。内部类与自身一起序列化外部类,即使这不是您的意图。解决方案:静态。
  • 请看我在下一个答案中的评论。我知道原因但不知道解决方案:-)

标签: java serialization serializable notserializableexception


【解决方案1】:

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

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


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

【讨论】:

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