簡體   English   中英

序列化擺動/自動組件

[英]Serializing swing/awt components

我正在嘗試序列化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不可序列化。 有幾種選擇(從最不推薦到最不推薦)。

  • 子類化GroupLayout以創建一個串行代理(請參閱Effective Java 2nd Ed)。 這是一項相當大的工作,並且由於GroupLayout沒有完整的“ getter and setters”集而變得復雜。

  • 用可序列化的LayoutManager替換GroupLayout Java庫中有實用但粗糙的GridBagLayout 其他布局管理器也可用。

  • 不要序列化JPanel 使AWT組件可序列化(以及整個JavaBeans)是一個可笑的錯誤。

為了可序列化,對象(以及POJO以外的所有部分)需要實現Serializable接口。

如果您不能更改類,請查看XStream

要序列化一個對象,它引用的所有對象也需要序列化。 如果您不希望序列化參考transient則可以將其標記為transient 這意味着,如果您的面板引用的是不可鋸齒的對象,請使其也可鋸齒或將其標記為transient

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM