【问题标题】:Serialization of an object "that has fields reverenced by a SWT class"“具有 SWT 类崇敬的字段”的对象的序列化
【发布时间】:2017-11-22 13:46:05
【问题描述】:

我有点被一个问题困住了。我确实了解序列化的概念。然而,当我尝试序列化/反序列化(deepCopy)一个对象时,我遇到了错误:

我有一个包含信息的基本域对象(两个文件):

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

我还有一个框架,以便用户可以填写此域对象的所有必要信息。由于我有多个具有不同字段的域对象(此示例仅显示一个),因此每个域对象都有不同的框架。这些框架中的每一个都包含一个“MultiLanguageFrame”,它使用户能够为此域对象的描述添加可选的翻译。

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

我通过这个方法deepCopy对象:

...
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$

}

所以现在错误: 当我尝试做这样的事情时:

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

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

deepCopy(dom);

我收到一条错误消息,告诉我 MultiLanguageFrame 不可序列化。当我只想要那个 DomainObject 时,为什么 Java 会尝试序列化帧?

我想可能是因为框架中的引用。因此,当我将 Serializable-Interface 添加到 MultiLanguageFrame 并将 SWT-Components 标记为 transient 时,它告诉我没有找到有效的构造函数。我不能添加无参数构造函数,因为它在逻辑上没有意义,而且 SWT-Components 需要父级存在。

我真的被这个问题困住了,因为我不知道如何解决这个问题。提前感谢您的回答!

【问题讨论】:

  • 什么是Translation?是否声明为MultiLanguageFrame 的内部类?
  • 编辑/添加翻译。
  • 如果TranslationMultiLanguageFrame 的内部类会有所不同吗?

标签: java serialization swt deserialization deep-copy


【解决方案1】:

我自己找到了解决方案。我只是发布这个,以便其他人可以看到它,它可能会有所帮助。

感谢带路的@greg-449。我确实有一个内部类TranslationHelper,它在MultiLanguageFrame 中扩展了Translation。这样做的目的是让我可以在不更改 Translation 本身的情况下为翻译保存一些标志(已删除、已更改、新)。当我调用frame.getTranslations() 时,我将元素从TranslationsHelper 转换为Translation。该对象的实例仍然是 TranslationHelper

现在,MultiLanguageFrame 参与了所有这一切,这一切都说得通了。

【讨论】:

  • 如果它实际上并没有访问MultiLanguageFrame,您可以将该类标记为static以避免此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2011-12-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
相关资源
最近更新 更多