2012-03-26 83 views
0

我試圖序列化一個JPanel,但每次我得到這個錯誤:序列化鞦韆/ AWT組件

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

在閱讀中的最後一步的序列化對象我遇到上述錯誤。什麼原因,或者任何想法應該如何做到這一點?

+1

這將是更好的序列化面板的數據,或兒童的價值(文本字段,組合,列表等),比面板本身。 – 2012-03-26 14:50:08

+0

@AndrewThompson,是的,但它是複雜的方式來挑選面板中的每個對象,面板本身是JUNG框架的一部分,被稱爲可視化查看器,它顯然擴展了JPanel – 911TurboS 2012-03-26 14:54:24

回答

2

要可序列化對象(及其所有部分除POJO外)需要實現Serializable接口。

如果您無法更改班級,請參閱XStream

+0

類實現了可序列化的接口:實現java。 io.Serializable,但錯誤是一樣的 – 911TurboS 2012-03-26 14:47:34

+0

javax.swing.GroupLayout沒有實現它。嘗試添加一個瞬變。 – Burkhard 2012-03-26 14:50:44

+0

好吧,我嘗試它,實際上它不是一個真正的面板,而是一個擴展面板和來自外部庫的類,所以需要大量的手動更改,但我現在嘗試,謝謝 – 911TurboS 2012-03-26 14:53:38

2

要序列化一個對象,它引用的所有對象也需要序列化。如果您不想將其序列化,則可以標記參考transient。這意味着,如果你的面板是指不serilizable對象,使他們serilizable藏漢或將它們標記transient

+0

有趣,我會嘗試將返回,如果我得到一些問題 – 911TurboS 2012-03-26 14:52:50

3

的JPanel實現Serializable ...

但javax.swing.GroupLayout沒有。

因此,您需要將GroupLayout更改爲另一個佈局類!

3

GroupLayout,似乎已添加到面板,不可串行化。有幾個選項(列出最不利於最有利的)。

  • 子類GroupLayout創建一個串行代理(見有效的Java第二版)。這是一個相當的工作,並且由GroupLayout並沒有一套完整的「getter和setter」複雜。

  • 用可串行化的LayoutManager代替GroupLayout。 Java庫中有功能性但粗糙的GridBagLayout。其他佈局管理器可用。

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

+0

感謝您的有用評論 – 911TurboS 2012-03-26 15:07:48

+0

@Tom很好的答案+1 – mKorbel 2012-03-26 15:42:24

+0

+1爲第三個項目符號。直接從JPanel的API:'警告:此類的序列化對象將與未來的Swing版本不兼容' – splungebob 2014-06-14 13:59:46