简体   繁体   中英

Serialization of an object “that has fields reverenced by a SWT class”

I'm kind of stuck with a problem. I do understand the concept of serialization. Nevertheless I'm getting errors when I try to serialize/deserialize (deepCopy) an object:

I have a basic domain objects that hold information (two files):

public class DomainObject implements java.io.Serializable {

   private String defaultDescription = "";
   private List<Translation> translations;

   public DomainObject() {
      ;
   }

   public void setTranslations(final List<Translation> newTranslations) {
      this.translations = newTranslations;
   }
   public List<Translation> getTranslations() {
      return this.translations;
   }

   public void setDefaultDescription(final String newDescription) {
      this.defaultDescription = newDescription;
   }
   public String getDefaultDescription() {
      return this.defaultDescription;
   }

}

public class Translations implements java.io.Serializable {

   private String description = "";

   public Translation() {
      ;
   }

   public void setDescription(final String newDescription) {
      this.description = newDescription;
   }
   public String getDescription() {
      return this.description;
   }
}

I also have a frame so the user can fill in all the necessary information for this domain object. Since I have multiple domain objects (this example only shows one) with different fields I have different frames for each domain object. Each of these frames includes a "MultiLanguageFrame" which gives the user the ability to add optional translations for this domain object's description.

public class MultiLanguageFrame extends org.eclipse.swt.widgets.Composite {

   private List<Translation> translations = new ArrayList<Translation>();

   public MultiLanguageFrame(final Composite parent, final int style) {
      super(parent, style);
      ...
   }

   public List<Translation> getTranslations() {
      return translations;
   }
}

I deepCopy objects via this method:

...
ObjectOutputStream oos = null;
ObjectInputStream ois = null;

try {
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   oos = new ObjectOutputStream(baos);
   oos.writeObject(object);
   oos.flush();
   ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
   ois = new ObjectInputStream(bais);
   return ois.readObject();

} catch (Exception t) {

   logger.error(deepCopy() error: " + t.getMessage()); //$NON-NLS-1$
   throw new RuntimeException("deepCopy() error", t); //$NON-NLS-1$

}

So now to the error: When i try to do something like this:

MultiLanguageFrame frame = new MultiLanguageFrame(parent, SWT.NONE);

DomainObject dom = new DomainObject();
dom.setDefaultDescription("Testobject");
dom.setTranslations(frame.getTranslations())

deepCopy(dom);

I receive an error telling me that MultiLanguageFrame is not Serializable. Why would Java try to serialize the frame when I only want that DomainObject?

I thought maybe it is because of the reference in frame. So when I add the Serializable-Interface to MultiLanguageFrame and markt the SWT-Components as transient it tells me that no valid constructor was found. I can't add a parameterless constructor because it would logically make no sense and also SWT-Components need a parent to exist.

I'm really stuck with this problem because I do not know how to work around this. Thanks for answers in advance!

I found the solution myself. I'll just post this so others can see it, it might help.

Thanks to @greg-449 who lead the way. I do have an inner class TranslationHelper which extends Translation in MultiLanguageFrame . The purpose of this is so I can save some flags (deleted, changed, new) for Translations without changing Translation itself. When I call frame.getTranslations() I cast the elements from TranslationsHelper to Translation . The instance of the object remains a TranslationHelper though.

Now it all makes sense that MultiLanguageFrame was involved in all of this.

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