2016-07-07 11 views
2

私はインターフェースを使ってリストをシリアライズして逆シリアル化しようとしましたが、yamldotnetはそれをデシリアライズできないという問題があります。インタフェースを使ってリストをシリアライズ/逆シリアル化する方法

私は例であなたにそれを示しました:

interface IAnimal 
{ 
    string Name { get; } 
} 
class Cat : IAnimal 
{ 
    public string Name { get; set; } 
    public string CustomThing { get; set; } = "1a"; 
} 
class Dog : IAnimal 
{ 
    public string Name { get; set; } 
    public bool IsSomething { get; set; } = true; 
} 

私は今、これをシリアル化しようとすると:

var serializer = new Serializer(); 
List<IAnimal> animals = new List<IAnimal>() 
{ 
    new Cat() { Name = "Oscar" }, 
    new Dog() { Name = "WuffWuff" } 
}; 
var writer = File.CreateText("test.yml"); 
serializer.Serialize(writer, animals); 
writer.Close(); 

この結果は

- Name: Oscar 
    CustomThing: 1a 
- Name: WuffWuff 
    IsSomething: true 

だろう私はこの点として、yamldotnetはどんな型であるかを知ることができず、クラス型も内部で定義されている必要があることを理解していますyml

これをアーカイブするにはどうすればよいですか?

私は既にdocumentationで何かを見つけようとしましたが、例だけがあり、interfaces/listのものはありません。

答えて

1

あなたはtagsを使用してノードの種類を指定することができます:!は次のとおりです。

deserializer.RegisterTagMapping("tag:yaml.org,2002:cat", typeof(Cat)); 
deserializer.RegisterTagMapping("tag:yaml.org,2002:dog", typeof(Dog)); 

- !cat 
    Name: Oscar 
    CustomThing: 1a 
- !dog 
    Name: WuffWuff 
    IsSomething: true 

あなたは!cat!dogに対応してどのような種類のYamlDotNetを指示する必要がありますtag:yaml.org,2002:の略語。タグマッピングを登録するときは、完全なUriを使用する必要があります。

はここであなたに非常に似てサンプルコードです:https://dotnetfiddle.net/GZtqvL


シリアライザもタグを発するサポートしています。この動作を有効にするには、コンストラクタにSerializationOptions.Roundtripフラグを指定する必要があります。ただし、シリアライザでタグマッピングを指定することはできません。

+0

でもシリアライザはこれを '' .yml''に追加しません。デシリアライザのメソッドに似たものがありますか? – jmattheis

+0

シリアライザで 'SerializationOptions.Roundtrip'を指定すると、タグが追加されます。 –

+0

これをあなたの答えで編集できますか? – jmattheis

関連する問題