是否可以将以下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);
}
有没有其他选择呢?
答案 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描述了一种解决方法:
- 首先,用。装饰Dictionary属性 XmlIgnore属性。这说明了 XmlSerializer忽略该属性, 消除反射误差。
- 创建一个新的公共属性,该属性获取并返回一个数组 DictionaryEntry对象。我倾向于 特别说出这些 (_x_DictionaryName)这样就可以了 一般不应该使用 这个属性。
- 序列化。
醇>
答案 1 :(得分:0)
您可以使用此课程:SerializableDictionary。
您需要更改属性类型:
public class Config
{
public SerializableDictionary<String, String> DatabaseConnections
{ get; set; }
}