YamlDotNet 和自定义类型

Big*_*ion 5 c# user-defined-types deserialization yamldotnet

我正在发现 yaml 和 yamldotnet。抱歉,如果这是一个非常基本的问题:

  • 使用单个感叹号在 yaml 中定义用户定义类型是否有意义,例如:

    红色:!color { 红色:255,绿色:0,蓝色:0 }

  • YamlDotNet 是如何反序列化的?换句话说,有没有办法确保类型 color 映射到 .net 中相应的 Color 类型?

  • 根据我对以下示例https://dotnetfiddle.net/HD2JXM的理解,YamlDotNet 使用 yaml 文档和 .net 类之间的隐式对应关系将 yaml 属性映射到相应的类属性(如示例所示,这个可以自定义带注释)。但是不进行类型检查。

为了进一步澄清事情。我有以下 yaml 文档,它对应于一组小部件:

controls:
  - Button:
      id: 1
      text: Hello Button World
  - Label:
      id: 2
      text: Hello Label World
  - TextView:
      id: 3
      content: >
        This is some sample text that will appear
        in a text view.
Run Code Online (Sandbox Code Playgroud)

我想将它映射到 C# 中相应的类型层次结构:

class AOPage
{
    public IList<AOControl> Controls { get; set; }

}

class AOControl 
{
    public int Id { get; set;}
}

class AOLabel : AOControl
{
    public String Text { get; set;}
}

class AOButton : AOControl
{
    public String Text { get; set;}
}

class AOTextView : AOControl
{
    public String Contents{ get; set;}
}
Run Code Online (Sandbox Code Playgroud)

请注意,这里有一个类似的问题海报:使用自定义类型解析器,该问题尚未得到解答。

谢谢!

Ant*_*bry 4

如果不指定标签,反序列化器将使用正在反序列化的对象图中的类型信息。

为了使用 YamlDotNet 执行您想要的操作,最简单的方法是使用本地标签,!!color然后为该标签注册一个标签映射:

deserializer.RegisterTagMapping("tag:yaml.org,2002:color", typeof(Color));
Run Code Online (Sandbox Code Playgroud)

您可以在DeserializeCustomTags 单元测试中看到一个工作示例。