2009-11-06 77 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; } 
}