【问题标题】:Serializing swing/awt components序列化 swing/awt 组件
【发布时间】:2012-03-26 14:43:37
【问题描述】:

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

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

【问题讨论】:

  • 最好序列化有关面板的数据或子项的值(文本字段、组合、列表等),而不是面板本身。
  • @AndrewThompson,是的,但是对我来说,在面板中挑选每个对象很复杂,面板本身是 JUNG 框架的一部分,被称为可视化查看器,显然扩展了 JPanel

标签: java swing serialization jpanel


【解决方案1】:

JPanel 实现了可序列化...

但是 javax.swing.GroupLayout 没有。

所以,你需要将 GroupLayout 更改为另一个布局类!

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • +1 表示第三个项目符号。直接来自 JPanel 的 API:Warning: Serialized objects of this class will not be compatible with future Swing releases
    【解决方案3】:

    要序列化一个对象,它引用的所有对象也需要是可序列化的。如果您不希望它被序列化,您可以标记参考transient。这意味着,如果您的面板引用了不可序列化的对象,请将它们也设为可序列化或标记它们transient

    【讨论】:

    • 很有趣,如果我有问题我会尝试会回来的
    【解决方案4】:

    为了可序列化对象(以及它的所有部分,POJO 除外)需要实现 Serializable 接口。

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

    【讨论】:

    • 该类确实实现了可序列化接口:实现 java.io.Serializable 但错误是一样的
    • javax.swing.GroupLayout 没有实现它。尝试向其添加瞬态。
    • 好吧,我试试看,实际上它不是一个面板,而是一个扩展面板的类,并且来自外部库,因此需要进行大量手动更改,但我现在尝试,谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2013-01-28
    • 1970-01-01
    • 2010-11-13
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多