[英]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.