2017-03-04 3 views
1

Ich habe gerade angefangen, mit Yaml zu arbeiten und würde wirklich etwas Input schätzen. Ich erstelle eine YAML und versuche, sie zu existierender C# -Klasse zu deserailisieren. Bestehende C# Klasse:Deserialisieren Yaml in C# -Objekt

[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; 
       } 
      } 

Jetzt habe ich eine Yaml,

HeadType: 
    - Bar: 0 
    - Bar: 29 

Wenn ich versuche, die oben Yaml deserialze, ich habe keine Fehler.

Aber wenn ich meine Yaml zu etwas wie unten ändern, weiß es nichts über das Tag Foo.

HeadType: 
    - Bar: 0 
    Foo: FooTest 

Gibt es eine Möglichkeit, dies zu erreichen? Ich habe das, unter dem auch versucht doesnot Arbeit:

HeadType: 
    FooType: 
    - Bar: 0 
     Foo: FooTest 

Ich verwende Yaml net Serialisierung „YamlDotNet.Serialization“ dot und das ist, wie die Serialisierung funktioniert:

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

wo Root ist die Klasse enthält den HeadType.

Antwort

0

Versuchen Sie es mit

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

YamlDotNet schließen nicht den tatsächlichen Typ basierend auf dem Inhalt vorhanden ist, so dass Sie es sagen müssen, die es geben ist von Tags. Beim Laden müssen diese Tags mit dem Deserializer registriert werden:

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