与序列化一样,您的类应该有一个不带参数的构造函数:
abstract class AbstractAlgorithm {
public AbstractParameter abstractParam;
}
public class ConcreteAlgorithm extends AbstractAlgorithm {
public ConcreteEnum.Enum1 param1;
public ConcreteEnum.Enum2 param2;
}
除了字段之外,无论它们有什么接口,都与这个问题无关。我将这些字段公开,因为当您进行反序列化时,它们没有真正的意义,除非您想在设置器中处理给定的值,在这种情况下您将使用设置器。
现在定义了这些类型,加载将按如下方式进行:
Constructor constructor = new Constructor();
constructor.addTypeDescription(
new TypeDescription(ConcreteAlgorithm.class, new Tag("!concrete")));
yaml = new Yaml(constructor);
AbstractAlgorithm = yaml.loadAs(someInput, AbstractAlgorithm.class);
正在加载的 YAML 看起来像这样:
--- !concrete
abstractParam: spam
param1: egg
param2: sausage
The ---
is the 指令结束标记,它开始文档的内容并且是可选的。我们在这里使用它是为了明确以下标记适用于文档的根节点。
!concrete
是根节点的标签。由于我们使用 SnakeYAML 注册它,因此它将导致 SnakeYAML 从该文件构造一个 ConcreteAlgorithm 对象。
以下键值对为 ConcreteAlgorithm 的每个字段(包括继承的字段)提供值。 SnakeYAML 将根据所使用的类的性质处理字段值 –AbstractParameter
如果它是一个类,可能希望在 YAML 文件中具有嵌套映射。如果AbstractParameter
是另一个抽象类并且有ConcreteParameter
作为实施,你会做
--- !concrete
abstractParam: !cp
droggel: jug
param1: egg
param2: sausage
并注册!cp
作为标签ConcreteParameter
。包含键的嵌套映射droggel
然后会生成一个实例ConcreteParameter
并被分配到该字段abstractParam
.
由于您可以在任何级别上提供标签,因此您可以在将 YAML 加载到的结构中的任何位置嵌套具有抽象类类型的字段。