C# 为什么';XmlSerializer支持字典?

C# 为什么';XmlSerializer支持字典?,c#,xml,dictionary,xmlserializer,C#,Xml,Dictionary,Xmlserializer,只是好奇为什么XmlSerializer不支持字典 通过使用DataContractSerializer并将对象写入XmlTextWriter,您可以很容易地绕过它,但是考虑到字典实际上是一个键值对数组,字典的哪些特性使得XmlSerializer难以处理 事实上,您可以将一个IDictionary传递给一个需要IEnumerable哈希表的方法。哈希表通常需要哈希代码和相等比较器提供程序。这些文件不能在XML中轻松序列化,而且肯定不可移植 但我想你已经找到了答案。只需将哈希表序列化为列表,然后

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

通过使用
DataContractSerializer
并将对象写入
XmlTextWriter
,您可以很容易地绕过它,但是考虑到字典实际上是一个键值对数组,字典的哪些特性使得
XmlSerializer
难以处理


事实上,您可以将一个
IDictionary
传递给一个需要
IEnumerable

哈希表的方法。哈希表通常需要哈希代码和相等比较器提供程序。这些文件不能在XML中轻松序列化,而且肯定不可移植


但我想你已经找到了答案。只需将哈希表序列化为
列表,然后(重新)将其构建为哈希表。

这太晚了-但我在自己寻找答案时发现了这个问题,并认为我会与大家分享我的最终答案,即用另一个将所有内容序列化的工具替换
XmlSerializer

它对我来说是开箱即用的,可以序列化字典、多层自定义类型,甚至可以使用接口作为类型参数的泛型。还拥有完全许可的许可证

谢谢你,帕维尔·伊兹科夫斯基

您可以使用。 如果您有课程:

public class TestClass
{
    public Dictionary<int, string> Dictionary { get; set; }
}
输出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>

或者使用该代码:字典中的哪些方法/属性意味着它必须作为哈希表实现?Dictionary和IDictionary是键/值对的集合,不同于哈希表实现。从序列化的角度来看,我们的目标似乎是将数据从易失性内存中取出,以便以后能够重新加载。将任何数据重新加载到接口的不同具体实现中会导致不同的行为。序列化KeyValuePair不起作用。你会得到一个空标签。请参阅:DataContractSerializer也将序列化字典,并且现在是.NET Framework的一部分。
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 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>
Install-Package ExtendedXmlSerializer