使用包含混合子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。
我有一个摘要 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。