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

问题描述

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

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

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所述。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...