8

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

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

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

第二种方式很优雅,代码也很干净。但是,它会阻塞额外的“标签:值”对。此外,如果输入文件中缺少任何预期的“标签:值”对,它也会引发异常。

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

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

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

4

1 回答 1

6

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

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

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

于 2019-04-25T15:10:10.837 回答