Java 串行化swing/awt组件

Java 串行化swing/awt组件,java,swing,serialization,jpanel,Java,Swing,Serialization,Jpanel,我正在尝试序列化JPanel,但每次出现此错误时: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javax.swing.GroupLayout 你能告诉我,可能是什么问题,或者什么是序列化它的正确方法吗 我所做的很简单: 对于序列化: FileOutputStream f = new FileOutputStream("myfile.dat"); ObjectOutput

我正在尝试序列化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();
}  
现在进行反序列化:

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

在上一步读取序列化对象时,我遇到了上述错误。原因是什么,或者有什么想法,我们应该怎么做

要实现可序列化,对象(及其除POJO之外的所有部分)需要实现可序列化接口


如果无法更改类,请查看。

要序列化对象,它引用的所有对象也需要可序列化。如果不希望序列化引用,可以将其标记为瞬态引用。这意味着,如果您的面板引用了不可序列化的对象,请使它们也可序列化,或者将它们标记为“瞬态”

JPanel实现了可序列化

但是javax.swing.GroupLayout没有


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

GroupLayout
(似乎已添加到面板中)不可序列化。有几个选项(从最不有利到最有利)

  • 子类
    GroupLayout
    以创建串行代理(请参见第二版)。这是一项相当多的工作,并且由于
    GroupLayout
    没有一套完整的“getter和setter”而变得复杂

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

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


该类没有实现可序列化接口:实现java.io.Serializable,但错误是samejavax.swing.GroupLayout没有实现它。尝试添加一个瞬态。好的,我尝试了,实际上它不是一个面板,而是一个扩展面板的类,来自外部库,因此需要大量手动更改,但我现在尝试,最好序列化关于面板的数据或子项(文本字段、组合、列表等)的值,而不是面板本身。@AndrewThompson,是的,但对于我来说,拾取面板中的每个对象是非常复杂的,面板本身是JUNG框架的一部分,被称为visualization viewer,它显然扩展了JPanelinteresting,如果第三个项目出现问题,我将尝试返回+1。直接从JPanel的API开始:
警告:此类的序列化对象将与将来的Swing版本不兼容