C# 自定义字典到Yaml的序列化

C# 自定义字典到Yaml的序列化,c#,yamldotnet,C#,Yamldotnet,我希望找到一种干净的方法来定制YamlDotNet序列化程序的输出 我有以下POCO: public class MyClass{ public string Foo { get;set; } public Dictionary<string, string> Bar { get;set; } } 然后将其序列化,然后我将得到结果: Foo: bla Bar: key1: val1 key2: val2 然而,我需要得到的是 Foo: bla key1: val1

我希望找到一种干净的方法来定制YamlDotNet序列化程序的输出

我有以下POCO:

public class MyClass{
  public string Foo { get;set; }
  public Dictionary<string, string> Bar { get;set; }
}
然后将其序列化,然后我将得到结果:

Foo: bla
Bar:
  key1: val1
  key2: val2
然而,我需要得到的是

Foo: bla
key1: val1
key2: val2
我无法将key1、key2等添加为MyClass的属性,因为它们在运行时之前是未知的(值和键数)。有没有一种方法可以使用YamlDotNet实现这一点

我曾考虑过使用反射将MyClass中的所有内容转换为
字典
,但更喜欢更干净的实现


有什么方法可以将序列化控制到这种程度吗?

一个简单的解决方案是在
MyClass
中实现
IDictionary
。真正需要实现的成员只有枚举器。在那里,您将返回字典的内容,以及每个附加属性的另一个条目

如果您希望保持POCO干净,可以创建一个实现
IYamlTypeConverter
的类。我手头没有一台PC为您实现它,但您可以使用此代码作为示例:


(很抱歉,在智能手机上复制此代码不起作用。我将在访问合适的PC时添加此代码)

一个简单的解决方案是在
MyClass
中实现
IDictionary
。真正需要实现的成员只有枚举器。在那里,您将返回字典的内容,以及每个附加属性的另一个条目

如果您希望保持POCO干净,可以创建一个实现
IYamlTypeConverter
的类。我手头没有一台PC为您实现它,但您可以使用此代码作为示例:


(很抱歉,在智能手机上复制此代码不起作用。我将在访问合适的PC时添加此代码)

在您想要的解决方案中,Deserialzer如何知道反序列化的位置
key1:val1
?@lokusking-我只担心这方面的序列化。它是用来生成RAML的,所以它只是输出数据,而不是消耗数据。在您想要的解决方案中,Deserialzer如何知道在哪里反序列化
key1:val1
?@lokusking-我只担心这个问题的序列化。这是为了生成RAML,所以它只是输出数据,而不是消耗数据。谢谢Antoine。我使用IDictionary方法实现了它,但尝试在那里实现IYamlConverter并迭代字典,但每次它仍然输出“Bar”键(除非我遗漏了什么!),谢谢Antoine。我使用IDictionary方法实现了它,但尝试在那里实现IYamlConverter并迭代字典,但每次它仍然输出“Bar”键(除非我遗漏了什么!)
Foo: bla
key1: val1
key2: val2