将Yaml反序列化为c#对象

时间:2017-03-04 06:42:15

标签: c# serialization deserialization yaml yamldotnet

我刚开始与Yaml合作,非常感谢一些意见。我正在创建一个YAML并尝试将其取消现有的C#类。 现有的C#类:

    [System.Xml.Serialization.XmlIncludeAttribute(typeof(FooType))]

    public partial class BarType {

       private int barVariable;

       public Int Bar {
        get {
            return this.barVariable;
        }
        set {
            this.barVariable = value;
        }
    }


    }

    public partial class FooType : BarType {

       private string fooVariable;
       public string Foo {
        get {
            return this.fooVariable;
        }
        set {
            this.fooVariable = value;
        }
    }


[System.Xml.Serialization.XmlRootAttribute("HeadType", Namespace="xyz", IsNullable=false)]

public partial class HeadType {

    private BarType[] barTypesField;

    [System.Xml.Serialization.XmlArrayItemAttribute("FooService", typeof(FooType), IsNullable=false)]

      public BarType[] BarTypes {
          get {
                return this.barTypesField;
              }
           set {
                this.barTypesField = value;
               }
            }

现在我有一个Yaml,

HeadType:
  - Bar: 0
  - Bar: 29

当我尝试反序列化上面的Yaml时,我没有收到任何错误。

但是当我将我的Yaml更改为类似下面的内容时,它会知道标签Foo。

HeadType:
  - Bar: 0 
    Foo: FooTest

有没有办法实现这个目标?我尝试过以下哪些也行不通:

HeadType:
  FooType:
    - Bar: 0
      Foo: FooTest

我正在使用Yaml dot net序列化“YamlDotNet.Serialization”,这就是序列化的工作原理:

    Deserializer deserializer = new Deserializer();
    var result = deserializer.Deserialize<RootType>(yamlInput1);

其中Root是包含HeadType的类。

1 个答案:

答案 0 :(得分:0)

尝试使用

HeadType:
  - !bar
    Bar: 0
  - !foo
    Bar: 0
    Foo: FooTest

YamlDotNet不会根据存在的内容推断出实际类型,因此您需要使用标签告诉它是哪种类型。加载时,您需要使用反序列化器注册这些标记:

deserializer.RegisterTagMapping("!bar", typeof(BarType));
deserializer.RegisterTagMapping("!foo", typeof(FooType));