序列化swing / awt组件

时间:2012-03-26 14:43:37

标签: java swing serialization jpanel

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

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

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

我所做的很简单:

FOR Serializing:

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();
}  

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

4 个答案:

答案 0 :(得分:3)

JPanel实现Serializable ...

但是javax.swing.GroupLayout没有。

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

答案 1 :(得分:3)

似乎已添加到面板中的

GroupLayout不可序列化。有几个选项(列出最少至最有利)。

  • 创建串行代理的子类GroupLayout(请参阅Effective Java 2nd Ed)。这是一项相当多的工作,由于GroupLayout没有一套完整的“获取者和制定者”而变得复杂。

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

要序列化对象,它引用的所有对象也需要可序列化。如果您不希望序列化,可以标记引用transient。这意味着,如果您的面板指的是不可电化的物体,请将它们涂抹成可涂层或标记它们transient