好奇为什么XmlSerializer
不支持词典?
使用DataContractSerializer
并将对象写入XmlTextWriter
,您可以轻松地绕过它,但是词典的特征是XmlSerializer
难以处理考虑到它确实是一个KeyValuePairs数组。
事实上,您可以将IDictionary<TKey, TItem>
传递给期望IEnumerable<KeyValuePairs<TKey, ITem>>
的方法。
答案 0 :(得分:27)
Hashtables通常需要哈希码和相等比较器提供程序。这些不能用XML轻松序列化,绝对不能移植。
但我认为你已经找到了答案。只需将哈希表序列化为List<KeyValuePair<K,V>>
,然后(重新)将其构建为哈希表。
答案 1 :(得分:7)
这已经很晚了 - 但是我在找到答案的同时找到了这个问题,并且我认为我会分享我最终的答案,即用一个不同的工具替换XmlSerializer
,将序列化所有内容:
http://www.sharpserializer.com
它直接开箱即用,序列化字典,多层自定义类型,甚至使用接口作为类型参数的泛型。还拥有完全许可的许可证。
谢谢Pawel Idzikowski!
答案 2 :(得分:3)
您可以使用ExtendedXmlSerializer。 如果你有一个班级:
public class TestClass
{
public Dictionary<int, string> Dictionary { get; set; }
}
并创建此类的实例:
var obj = new TestClass
{
Dictionary = new Dictionary<int, string>
{
{1, "First"},
{2, "Second"},
{3, "Other"},
}
};
您可以使用ExtendedXmlSerializer序列化此对象:
var serializer = new ConfigurationContainer()
.UseOptimizedNamespaces() //If you want to have all namespaces in root element
.Create();
var xml = serializer.Serialize(
new XmlWriterSettings { Indent = true }, //If you want to formated xml
obj);
输出xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<TestClass xmlns:sys="https://extendedxmlserializer.github.io/system" xmlns:exs="https://extendedxmlserializer.github.io/v2" xmlns="clr-namespace:ExtendedXmlSerializer.Samples;assembly=ExtendedXmlSerializer.Samples">
<Dictionary>
<sys:Item>
<Key>1</Key>
<Value>First</Value>
</sys:Item>
<sys:Item>
<Key>2</Key>
<Value>Second</Value>
</sys:Item>
<sys:Item>
<Key>3</Key>
<Value>Other</Value>
</sys:Item>
</Dictionary>
</TestClass>
您可以从nuget安装ExtendedXmlSerializer或运行以下命令:
Install-Package ExtendedXmlSerializer