gpt4 book ai didi

c# - 如何使用接口(interface)序列化/反序列化列表

转载 作者:行者123 更新时间:2023-11-30 23:23:40 24 4
gpt4 key购买 nike

我正在尝试使用接口(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 无法知道哪些类型,并且需要在 yml

中定义类类型

那么我该如何存档呢?

我已经尝试在 documentation 中找到一些东西但只有示例,没有任何接口(interface)/列表。

最佳答案

您可以使用 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 标志。不过,目前无法在序列化程序上指定标记映射。

关于c# - 如何使用接口(interface)序列化/反序列化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38248697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com