【问题标题】:Why doesn't XmlSerializer support Dictionary?为什么 XmlSerializer 不支持 Dictionary?
【发布时间】:2011-02-24 02:05:29
【问题描述】:

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

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

事实上,您可以将IDictionary<TKey, TItem> 传递给期望IEnumerable<KeyValuePairs<TKey, ITem>> 的方法。

【问题讨论】:

    标签: c# xml dictionary xmlserializer


    【解决方案1】:

    这已经很晚了 - 但我在自己寻找答案时发现了这个问题,并认为我会分享我的最终答案,即用可以序列化所有内容的不同工具替换 XmlSerializer:

    http://www.sharpserializer.com

    它直接开箱即用,序列化字典和多层自定义类型,甚至使用接口作为类型参数的泛型。还具有完全许可的许可证。

    谢谢帕维尔·伊齐科夫斯基!

    【讨论】:

    • DataContractSerializer 也将序列化字典,现在是 .NET Framework 的一部分。
    【解决方案2】:

    您可以使用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
    

    【讨论】:

      【解决方案3】:

      哈希表通常需要哈希码和相等比较器提供程序。这些在 XML 中不容易序列化,而且绝对不能移植。

      但我想你已经找到了答案。只需将哈希表序列化为List&lt;KeyValuePair&lt;K,V&gt;&gt;,然后(重新)将其构造为哈希表。

      【讨论】:

      • Dictionary 中的哪些方法/属性暗示它必须实现为哈希表? Dictionary 和 IDictionary 是键/值对的集合,与 Hashtable 实现不同。从序列化的角度来看,我们的目标似乎是将数据从易失性内存中取出,以便以后能够将其加载回。将 any 数据重新加载到接口的不同具体实现中会导致不同的行为。
      • 序列化 KeyValuePair 不起作用。你最终会得到一个空标签。见:stackoverflow.com/questions/2658916/…
      猜你喜欢
      • 1970-01-01
      • 2011-07-23
      • 2021-12-12
      • 1970-01-01
      • 2011-03-17
      • 2018-07-21
      • 2013-01-04
      • 2017-10-07
      • 2018-08-24
      相关资源
      最近更新 更多