2009-11-06 78 views
0

是否可以将以下一段XML反序列化为一个Dictionary<int,string>对象?如何将Xml反序列化为字典<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

为什么是字典?不应该是Dictionary 或者你想如何将字符串映射到int以及有什么价值? – 2009-11-06 17:58:19

回答

3

不能使用默认XmlSerializer实施(反)序列IDictionary对象到XML。从MSDN文档XmlSerializer

XmlSerializer的给予特别 处理,实现IEnumerable的 或ICollection的类。实现IEnumerable的 类必须 实现一个公共的Add方法,其中 为单个参数。方法的参数必须与从 GetEnumerator返回的值的当前 属性返回的 类型相同,或者该类型的 基数之一。

Dictionary<>类实现这两个接口,但不具有Add方法,该方法采用单个参数,所以它失败。通过继承Dictionary<>并添加

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

所以你甚至不能使工作:

更重要的是,XML序列化代码明确禁止实现IDictionary类(从反射镜,看着TypeScope.GetDefaultIndexer)要求Add过载。

的制品Generic Dictionaries vs. the XmlSerializer描述了一个解决方法:

  1. 首先,装饰字典属性与 一个XmlIgnore属性。这告诉 XmlSerializer忽略该属性, 消除反射错误。
  2. 创建一个新的公共属性,获取并返回一个 DictionaryEntry对象数组。我倾向于 这些特别名称 (_x_DictionaryName),因此它是 清除一个不应该使用 此属性。
  3. 序列化。
0

您可以使用此课程:SerializableDictionary

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

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