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

では、どうすればこれをアーカイブできますか?

私はすでにドキュメントで何かを見つけようとしましたが、例だけがあり、インターフェース/リストには何もありません。

4

1 に答える 1

2

tagsを使用してノードのタイプを指定できます。

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

YamlDotNet に and に対応する型を伝える必要があり!catます!dog

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

:!は . の省略形ですtag:yaml.org,2002:。タグ マッピングを登録するときは、完全な Uri を使用する必要があります。

これはあなたのものと非常によく似たコード例です: https://dotnetfiddle.net/GZtqvL


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

于 2016-07-07T16:16:30.367 に答える