假设我们有一款游戏,其中的角色具有特殊能力。所有能力共享一个名为 AbstractAbility 的抽象基类型。每个角色都有一个所述基本类型的列表(List),其中的元素是派生类的对象(List example = new List(){new StompAbility(), new TeleportAbility()})。
问题是该列表需要通过配置文件进行更改,但 YAML 无法正确反序列化 AbstractClass。
到目前为止,我可以通过向 AbstcratAbility 类添加一个名为 AbilityType 的字段来绕过这个问题,该字段包含它所属的派生类的名称,基本上告诉 YAML 它实际上试图反序列化的类型。但是有没有一种方法可以让我不用采取这些措施就能达到理想的结果呢?
YAML 支持为此用例设计的标签:
characters:
- name: John
abilities:
- !StompAbility
name: Stomp
stompiness: 12
abilityPoints: 2
- !TeleportAbility
name: Teleport
range: 200m
abilityPoints: 5
通过标记列表条目,反序列化 YAML 的代码可以为条目选择适当的类。
对标签的支持因 YAML 实现而异。有些(例如 PyYAML、SnakeYaml)允许您显式注册标签并将它们链接到类型。其他(例如 go-yaml、libyaml)仅发出标签,您需要自己处理它们。