如何serialize/deserialize列表界面
How to serialize/deserialize list with interface
我试图用一个接口序列化和反序列化一个列表,问题是 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 无法知道是哪些类型,因此 class 类型也需要在 yml
中定义
那么我该如何存档呢?
我已经尝试在 documentation 中找到一些东西,但只有示例,没有任何接口/列表。
您可以使用 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:
的shorthand。注册标签映射时,我们需要使用完整的Uri。
这是一个与您的代码非常相似的示例代码:https://dotnetfiddle.net/GZtqvL
序列化器还支持发射标签。要激活此行为,您需要在构造函数中指定 SerializationOptions.Roundtrip
标志。不过,目前无法在序列化器上指定标记映射。
我试图用一个接口序列化和反序列化一个列表,问题是 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 无法知道是哪些类型,因此 class 类型也需要在 yml
那么我该如何存档呢?
我已经尝试在 documentation 中找到一些东西,但只有示例,没有任何接口/列表。
您可以使用 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:
的shorthand。注册标签映射时,我们需要使用完整的Uri。
这是一个与您的代码非常相似的示例代码:https://dotnetfiddle.net/GZtqvL
序列化器还支持发射标签。要激活此行为,您需要在构造函数中指定 SerializationOptions.Roundtrip
标志。不过,目前无法在序列化器上指定标记映射。