YamlDotNet和自定义类型

时间:2014-11-02 14:23:55

标签: c# deserialization user-defined-types yamldotnet

我发现了yaml和yamldotnet。对不起,如果这是一个非常基本的问题:

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

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

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

  • 根据我对以下示例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.

我想将它映射到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;}
}

请注意,此处有一个类似的问题海报:Using custom type resolver,尚未得到解答。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果未指定标记,则反序列化程序将使用正在反序列化的对象图中的类型信息。

为了用YamlDotNet做你想做的事,最简单的方法是使用本地标签,比方说!!color,然后注册该标签的标签映射:

deserializer.RegisterTagMapping("tag:yaml.org,2002:color", typeof(Color));

您可以在DeserializeCustomTags unit test中看到一个有效的例子。