2016-06-29 27 views
1

我正在寻找一种自定义YamlDotNet序列化器输出的干净方法。自定义字典的序列化为Yaml

我有以下POCO:

​​

如果我在上面设置的值一样

var class = new MyClass{ Foo = "bla" }; 
class.Bar["key1"] = "val1"; 
class.Bar["key2"] = "val2"; 

和序列化这个话,我会得到的结果:

Foo: bla 
Bar: 
    key1: val1 
    key2: val2 

然而,我需要得到的是

Foo: bla 
key1: val1 
key2: val2 

我无法添加KEY1,KEY2等作为MyClass的性能,因为它们是未知的,直到运行时(这两个值和密钥的数量)。有没有一种方法可以使用YamlDotNet来做到这一点?

我使用反射来一切都在MyClass的转换为Dictionary<string, object>考虑,但希望有一个更清洁的实现。

有什么办法,我可以控制序列化到这种程度?

+0

在您需要的解决方案,如何将desierialzer知道,在反序列化'键1:val1'? – lokusking

+0

@lokusking - 我只是担心这方面的serlialization。这是为了生成RAML,所以它只输出数据而不是消耗数据。 – Fermin

回答

0

一个简单的解决方法就是在MyClass实现IDictionary<string, string>。实际需要实施的唯一成员是统计员。在那里你会返回字典的内容,以及每个附加属性的另一个条目。

如果您希望将自己的POCO干净,你可以创建一个实现IYamlTypeConverter类。我不手边有一个PC来实现它适合你,但你可以使用此代码为例:

https://dotnetfiddle.net/1plIcc

(对不起,这里复制的代码是不能工作在智能手机上。我会添加代码的时候,当我有机会到合适的PC)

+0

谢谢安托万。我使用IDictionary <>方法工作,但尝试实现IYamlConverter并迭代Dictionary,但每次仍然输出'Bar'键(除非我错过了某些东西!) – Fermin