如何使用接口序列化/反序列化列表

时间:2016-07-07 14:53:34

标签: c# serialization yaml yamldotnet

我试图使用接口序列化和反序列化列表,问题是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中找到一些东西但是只有示例而且没有任何关于接口/列表的内容。

1 个答案:

答案 0 :(得分:2)

您可以使用tags指定节点的类型:

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

您需要告诉YamlDotNet哪些类型与!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标志。目前,无法在序列化器上指定标记映射。