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

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

- !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在构造函数中指定标志。不过,目前无法在序列化程序上指定标签映射。

于 2016-07-07T16:16:30.367 回答