如何将Xml反序列化为Dictionary <int,string> object?</int,string>

时间:2009-11-06 17:48:12

标签: c# xml dictionary serialization generics

是否可以将以下XML片段反序列化为Dictionary<int,string>对象?

XML:

<Config>

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

<Config>

我有一个属性为Dictionary<int,string> {get;set;}

的类

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

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

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

有没有其他选择呢?

2 个答案:

答案 0 :(得分:3)

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

  

XmlSerializer提供特殊功能   对实施的类的处理   IEnumerable或ICollection。一类   实现IEnumerable必须   实现一个公共的Add方法   只需一个参数。添加   method的参数必须相同   从Current返回的type   返回值的属性   GetEnumerator,或其中一种类型的   碱基。

Dictionary<>类实现了两个接口,但没有采用单个参数的Add方法,因此失败。

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

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

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

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

  
      
  1. 首先,用。装饰Dictionary属性   XmlIgnore属性。这说明了   XmlSerializer忽略该属性,   消除反射误差。
  2.   
  3. 创建一个新的公共属性,该属性获取并返回一个数组   DictionaryEntry对象。我倾向于   特别说出这些   (_x_DictionaryName)这样就可以了   一般不应该使用   这个属性。
  4.   
  5. 序列化。
  6.   

答案 1 :(得分:0)

您可以使用此课程:SerializableDictionary

您需要更改属性类型:

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