使用包含混合子classed 对象类型的列表序列化抽象 class

Serialization of an abstract class with a list containing mixed subclassed object types

我有一个摘要 class,它定义了要在图形中绘制的得分项的结构。得分项有多种变体。它们都有相同的实例变量,但每个都有自己的绘图实现,非常庞大和复杂。这些绘图实现主要由测角计算组成,几乎不共享任何代码。

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

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

现在,我想使用一个图形 class,其中有一个 ScoreItems 列表。该列表可以包含抽象 ScoreItem 的不同变体,class 必须遍历 ScoreItems 才能绘制它们,如下所示:

public class Graphic {
  ...

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

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

现在应该可以了;我在一个简单的测试项目中测试了它。但是,我 运行 遇到了问题; Graphic class 必须序列化,我在反序列化时遇到了麻烦。这不起作用 (java.lang.RuntimeException:“class”字段未找到摘要 class)。我假设 GSON 不能反序列化为抽象 class。当我将 ScoreItem class 更改为常规 class 时,显然 GSON 反序列化有效,但是我无法在 subclasses 上使用 draw() 方法。

我希望我已经足够充分和充分地描述了这个问题。也许使用具有不同对象类型的列表并不是一个好习惯。非常感谢任何解决方案或建议。

答案将我推向了正确的方向,解决方案是使用 GSON 接口适配器(更改为抽象适配器)。

如所述here