微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有包含混合子类对象类型的列表的抽象类的序列化

如何解决具有包含混合子类对象类型的列表的抽象类的序列化

我有一个抽象类,定义了要在图形中绘制的刻痕项目的结构。得分项目有多种变体。它们都有相同的实例变量,但是每个都有其自己的绘图实现,这既很大又很复杂。这些绘图实现主要由测角计算组成,几乎不共享任何代码

为了保持代码的可读性,我想为每个变体使用一个子类。在子类中,我将定义绘图方法实现。请参见下面的简化示例。

abstract class scoreItem {
  int score;
  Color color;
  ...
  
  abstract void draw();

  public class RadarItem extends scoreItem {
    @Override
    public void draw() {
      // RADAR IMPLEMENTATION
      ...
    }
  }

  public class LineItem extends scoreItem {
    @Override
    public void draw() {
      // LINE IMPLEMENTATION
      ...
    }
  }
etc.
}

现在,我想使用一个Graphic类,其中有一个scoreItems列表。该列表可以包含抽象scoreItem的不同变体,并且该类必须在scoreItems上循环才能绘制它们,如下所示:

public class Graphic {
  ...

  public void generate() {
    List<scoreItem> scoreItems = ...;

    for (scoreItem scoreItem : scoreItems) { scoreItem.draw(); }
  }
}

在这应该可行;我在一个简单的测试项目中对其进行了测试。但是,我遇到了问题;图形类必须进行序列化,而我在反序列化方面遇到了麻烦。 java.lang.RuntimeException:“类”字段未找到抽象类)不起作用。我认为GSON无法反序列化到抽象类中。当我将scoreItem类更改为常规类时,显然GSON反序列化可以工作,但随后我不能在子类上使用draw()方法

我希望我已经足够简洁地描述了这个问题。可能将List与不同的对象类型一起使用可能不是一个好习惯。任何解决方案或建议都将不胜感激。

解决方法

答案正确无误,解决方案是使用GSON接口适配器(已更改为抽象适配器)。

here所述。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。