YamlDotNet - 需要反序列化器来忽略额外的节点或可以处理丢失的节点

onT*_*nTy 11 .net yamldotnet

我正在尝试使用 YamlDotNet 来帮助我解析配置文件。我研究了它的文档并发现了两种方法:

  1. 使用YamlStream的Load()方法,然后检查它创建的YamlDocument的节点;
  2. 编写一系列相关类用于结果存储,然后使用 Deserializer 的 Deserialize() 方法自动实例化对象并用数据填充对象。

第一种方法不是特别优雅(代码很乱)。但它允许我在输入文件中拥有额外的“标签:值”对。任何额外的内容都会被忽略。我还可以在代码中使用逻辑来检测是否缺少任何“标签”并跳过尝试读取其值。

第二种方法非常优雅,并且代码非常干净。然而,它会因为额外的“标签:值”对而窒息。此外,如果输入文件中缺少任何预期的“标签:值”对,它也会引发异常。

我正在寻找一种使用第二种方法(调用反序列化方法)的方法,但即使输入文件中存在额外数据或缺少某些内容,也允许它工作。

我没有找到我希望可以应用于对象模型成员的“可选”属性。

如果使用反序列化方法时可能有可选节点或额外未使用的节点,有人可以告诉我吗?

小智 16

第二种方法其实也是可行的。您需要执行以下操作:

  1. 为 YAML 文件中可能缺少的所有字段指定默认值,如下所示:
[DefaultValue(1)]
public double Priority { get; set; }
Run Code Online (Sandbox Code Playgroud)
  1. 告诉反序列化器忽略不匹配的属性,如以下代码片段所示。
var deserializer = new DeserializerBuilder()
    .IgnoreUnmatchedProperties()
    .Build();
var deserialized = deserializer.Deserialize<T>(input);
Run Code Online (Sandbox Code Playgroud)

我找不到有关此配置选项的任何文档,但对我来说它按预期工作。我唯一能找到的是介绍该功能的PR 。