java—用包含混合子类对象类型的列表对抽象类进行序列化

tzxcd3kk  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(326)

我有一个抽象类,它定义了要在图形中绘制的scoreitem的结构。评分项目有多种变体。它们都有相同的示例变量,但每个都有自己的绘图实现,这是相当大和复杂的。这些绘图实现主要由测角计算组成,几乎不共享任何代码。
为了保持代码可读性,我想为每个变量使用一个子类。在子类中,我将定义drawing方法的实现。参见下面的简化示例。

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

现在这应该管用了;我在一个简单的测试项目中进行了测试。然而,当我遇到问题时;graphic类必须序列化,我在反序列化时遇到了麻烦。这不起作用(java.lang.runtimeexception:未找到抽象类的“class”字段)。我假设gson不能反序列化到抽象类中。当我将scoreitem类更改为常规类时,显然gson反序列化是有效的,但是我不能对子类使用draw()方法。
我希望我对这个问题描述得足够充分和周密。也许使用不同对象类型的列表不是一个好的实践。任何解决方案或建议都将不胜感激。

kninwzqo

kninwzqo1#

答案将我推向正确的方向,解决方案是使用gson接口适配器(改为抽象适配器)。
如本文所述。

相关问题