为什么XmlSerializer不支持Dictionary?

只是好奇为什么字典不被XmlSerializer支持?

通过使用DataContractSerializer并将该对象写入XmlTextWriter ,您可以轻松解决这个问题,但是由于字典的特性使得XmlSerializer难以处理,因为它实际上是一个KeyValuePairs数组。

实际上,您可以将IDictionary<TKey, TItem>传递给期望IEnumerable<KeyValuePairs<TKey, ITem>>

散列表通常需要散列码和相等比较器提供者。 这些不能用XML很容易地序列化,而且绝对不会是可移植的。

但是我想你已经find了你的答案。 只要将散List<KeyValuePair<K,V>>序列化为一个List<KeyValuePair<K,V>> ,然后(重新)构造一个散列表。

这是waaay晚了 – 但我发现这个问题,而我自己寻找答案,并认为我会分享我最终的答案是将XmlSerializer与一个不同的将串行化的一切。

http://www.sharpserializer.com

它直接为我提供了工具,序列化字典和多层自定义types,甚至使用接口作为types参数的遗传学。 也有完全许可的许可证。

谢谢帕维尔Idzikowski!

您可以使用ExtendedXmlSerializer 。 如果你有一个class级:

 public class TestClass { public Dictionary<int, string> Dictionary { get; set; } } 

并创build这个类的实例:

 var obj = new TestClass { Dictionary = new Dictionary<int, string> { {1, "First"}, {2, "Second"}, {3, "Other"}, } }; 

您可以使用ExtendedXmlSerializer序列化此对象:

 ExtendedXmlSerializer serializer = new ExtendedXmlSerializer(); var xml = serializer.Serialize(obj); 

输出xml将如下所示:

 <TestClass type="Samples.TestClass"> <Dictionary> <Item> <Key>1</Key> <Value>First</Value> </Item> <Item> <Key>2</Key> <Value>Second</Value> </Item> <Item> <Key>3</Key> <Value>Other</Value> </Item> </Dictionary> </TestClass> 

您可以从nuget安装ExtendedXmlSerializer或运行以下命令:

 Install-Package ExtendedXmlSerializer