简体   繁体   中英

Serializing swing/awt components

I am trying to serialize a JPanel but everytime i get this error:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javax.swing.GroupLayout  

Can you tell me, what could be the problem or what is the proper way of serializing it.

What i do is pretty simple:

FOR Serializing:

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

And now for deserializing:

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

while reading the serialized object in last step i encounter the above error. What is the reason, or any idea how is should do this?

JPanel implements Serializable...

But javax.swing.GroupLayout don't.

So, you need to change GroupLayout to another layout class!

GroupLayout , which appears to have been added to the panel, is not serialisable. There are a few options (listed least to most favourable).

  • Subclass GroupLayout to create a serial proxy (see Effective Java 2nd Ed). This is a fair bit of work, and is complicated by GroupLayout not having a complete set of "getters and setters".

  • Replace GroupLayout with a serialisable LayoutManager . There's the functional but rough GridBagLayout in the Java library. Other layout managers are available.

  • Don't serialise the JPanel . Making AWT components serialisable (and the whole JavaBeans thing) was a laughable mistake.

To be serializeable the object (and all the parts of it with exception of the POJOs) needs to implement the Serializable interface.

If you cannot change the class, take a look at XStream .

To serialize an object, all the objects it references need to also be serializable aswell. You can mark a reference transient if you don't want it to be serialized. This means, if your panel refers to objects which are not serilizable, make them serilizable aswell or mark them transient

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM