序列化swing / awt组件

我正在尝试序列化JPanel,但每次我收到此错误:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javax.swing.GroupLayout 

你能告诉我,可能是什么问题或者序列化的正确方法是什么。

我做的很简单:

用于序列化:

 FileOutputStream f = new FileOutputStream("myfile.dat"); ObjectOutputStream ostream = new ObjectOutputStream(f); Object object = panel; //where panel is a JPanel type object ostream.writeObject(object); ostream.close(); 

现在用于反序列化:

 File file = new File("myfile.dat"); ObjectInputStream in; try { in = new ObjectInputStream(new FileInputStream(file)); object = (JPanel) in.readObject(); in.close(); } catch (Exception e2) { e2.printStackTrace(); } 

在最后一步读取序列化对象时遇到上述错误。 是什么原因,或任何想法应该如何做到这一点?

JPanel实现了Serializable ……

但是javax.swing.GroupLayout没有。

因此,您需要将GroupLayout更改为另一个布局类!

GroupLayout似乎已添加到面板中,不可序列化。 有几个选项(列出最不受欢迎)。

  • Subclass GroupLayout用于创建串行代理(请参阅Effective Java 2nd Ed)。 这是一项相当多的工作,而且由于GroupLayout没有一套完整的“getter and setters”而变得复杂。

  • GroupLayout替换为可序列化的LayoutManager 。 Java库中有function但粗糙的GridBagLayout 。 其他布局管理器可用。

  • 不要序列化JPanel 。 使AWT组件可序列化(以及整个JavaBeans的事情)是一个可笑的错误。

要序列化对象,它引用的所有对象也需要可序列化。 如果您不希望序列化,则可以标记参考transient 。 这意味着,如果您的面板指的是不可电化的物体,请将它们设置为可电化处理或将其标记为transient

要进行序列化,对象(以及除POJO之外的所有部分)都需要实现Serializable接口。

如果您无法更改课程,请查看XStream 。