2016-07-07 45 views
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

那么我该如何归档呢?

我已经试图找到documentation中的东西,但只有示例,没有任何与接口/列表。

回答

1

可以使用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标志。不过,目前还不可能在序列化器上指定标签映射。

+0

但是串行器仍然不会将这个添加到''.yml''中。是否有类似于解串器中的方法? – jmattheis

+0

在序列化程序中指定'SerializationOptions.Roundtrip'应该添加标记。 –

+0

你可以编辑这个在你的回答,然后它的完美! – jmattheis

相关问题