【问题标题】:How to Deserialise Xml into a Dictionary<int,string> object?如何将 Xml 反序列化为 Dictionary<int,string> 对象?
【发布时间】:2009-11-06 17:48:11
【问题描述】:

是否可以将以下 XML 片段反序列化为 Dictionary&lt;int,string&gt; 对象?

XML:

<Config>

<DatabaseConnections>
     <Connection Name="Source Connection" Value="ConnectionStringValue" />
     <Connection Name="Target Connection" Value="ConnectionStringValue" />
<DatabaseConnections>

<Config>

我有一个属性为Dictionary&lt;int,string&gt; {get;set;}的类

我想使用以下 C# 代码来执行此操作:

XmlSerializer xs = new XmlSerializer(typeof(Config));

using(StringReader sr = new StringReader(rootnode.OuterXml))
{
      return (Config)xs.Deserialize(sr);
}

有没有其他方法可以做到这一点?

【问题讨论】:

  • 为什么是 Dictionary ??不应该是 Dictionary 还是你想如何将字符串映射到 int 以及价值是什么?

标签: c# xml dictionary serialization generics


【解决方案1】:

您不能使用默认的XmlSerializer 实现将IDictionary 对象(反)序列化为Xml。来自 MSDN XmlSerializer 文档:

XmlSerializer 提供了特殊的 对实现类的处理 IEnumerable 或 ICollection。一类 实现 IEnumerable 必须 实现一个公共的 Add 方法 接受一个参数。添加 方法的参数必须相同 从 Current 返回的类型 返回值的属性 GetEnumerator,或该类型之一 基地。

Dictionary&lt;&gt; 类实现了这两个接口,但没有采用单个参数的 Add 方法,因此它失败了。

更重要的是,xml 序列化代码明确禁止实现 IDictionary 的类(来自 Reflector,查看 TypeScope.GetDefaultIndexer):

 if (typeof(IDictionary).IsAssignableFrom(type)) {
        if (memberInfo == null) {
            throw new NotSupportedException(...);
        }
        throw new NotSupportedException(...);
 }

因此,您甚至无法通过继承 Dictionary&lt;&gt; 并添加所需的 Add 重载来完成工作。

文章Generic Dictionaries vs. the XmlSerializer 描述了一种解决方法:

  1. 首先,用 XmlIgnore 属性。这告诉 XmlSerializer 忽略该属性, 消除反射误差。
  2. 创建一个新的公共属性,它接受并返回一个数组 DictionaryEntry 对象。我倾向于 特别命名这些 (_x_DictionaryName) 所以它是 清除一个通常不应该使用 此属性。
  3. 序列化掉。

【讨论】:

    【解决方案2】:

    你可以使用这个类:SerializableDictionary

    当然,您需要更改属性类型:

    public class Config
    {
         public SerializableDictionary<String, String> DatabaseConnections
         { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多