我正在尝试序列化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();
}
在最后一步读取序列化对象时遇到上述错误。是什么原因,或任何想法应该如何做到这一点?
答案 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