序列化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 。