2016-09-19 2 views
2

Я хочу преобразовать данные словаря в XML. Я пытаюсь использовать сериализацию XML, но я получаю сообщение об ошибке. Ниже мой код.Словарь Data Serialization в C#

class Program 
{ 

    static void Main(string[] args) 
    { 
     Dictionary<int, AddressDetails> objDic = new Dictionary<int, AddressDetails>(); 
     for (int i = 1; i <= 5; i++) 
     { 
      AddressDetails obj = new AddressDetails(); 
      obj.HouseNo = i; 
      obj.StreetName = "New Street One " + i; 
      obj.City = "New Delhi One " + i; 
      objDic.Add(i, obj); 
     } 

     string str = Utility.GetXMLFromObject(objDic); 
    } 

} 

public class AddressDetails 
{ 
    public int HouseNo { get; set; } 
    public string StreetName { get; set; } 
    public string City { get; set; } 
    private string PoAddress { get; set; } 
} 

public static class Utility 
{ 
    public static string GetXMLFromObject(object o) 
    { 
     StringWriter sw = new StringWriter(); 
     XmlTextWriter tw = null; 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(o.GetType()); 
      tw = new XmlTextWriter(sw); 
      serializer.Serialize(tw, o); 
     } 
     catch (Exception ex) 
     { 
      //Handle Exception Code 
     } 
     finally 
     { 
      sw.Close(); 
      if (tw != null) 
      { 
       tw.Close(); 
      } 
     } 
     return sw.ToString(); 
    } 
} 

Код ошибки линии: XmlSerializer serializer = new XmlSerializer(o.GetType());

Ошибка Описание:

Тип System.Collections.Generic.Dictionary`2 [[System.Int32, mscorlib, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089], [ConsoleApplication5.AddressDetails, ConsoleApplication5, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] не поддерживается, потому что она реализует IDictionary.

Просьба предложить.

+0

Словари не может быть сериализации. Пожалуйста, взгляните на это: http://stackoverflow.com/questions/12554186/how-to-serialize-deserialize-to-dictionaryint-string-from-custom-xml-not-us – kassi

+1

http://theburningmonk.com/2010/05/нетто-советы-XML-сериализация или-Deserialize-словарь-в-CSharp / – JFM

ответ

1

Используйте следующее расширение словаря.

[XmlRoot("Dictionary")] 
public class DictionaryEx<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable 
{ 
    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     XDocument document = null; 
     using (XmlReader subtreeReader = reader.ReadSubtree()) 
     { 
      document = XDocument.Load(subtreeReader); 
     } 

     if (document == null) 
      return; 

     XmlSerializer serializer = new XmlSerializer(typeof(KeyValuePairEx<TKey, TValue>)); 
     foreach (XElement element in document.Descendants(XName.Get("Item"))) 
     { 
      using (XmlReader xmlReader = element.CreateReader()) 
      { 
       var pair = serializer.Deserialize(xmlReader) as KeyValuePairEx<TKey, TValue>; 
       this.Add(pair.Key, pair.Value); 
      } 
     } 

     reader.ReadEndElement(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(KeyValuePairEx<TKey, TValue>)); 
     XmlSerializerNamespaces xmlNameSpaces = new XmlSerializerNamespaces(); 
     xmlNameSpaces.Add(string.Empty, string.Empty); 

     foreach (TKey key in this.Keys) 
     { 
      TValue value = this[key]; 
      var pair = new KeyValuePairEx<TKey, TValue>(key, value); 
      serializer.Serialize(writer, pair, xmlNameSpaces); 
     } 
    } 

    [XmlRoot("Item")] 
    public class KeyValuePairEx<TKey, TValue> 
    { 
     [XmlAttribute("Key")] 
     public TKey Key; 

     [XmlAttribute("Value")] 
     public TValue Value; 

     public KeyValuePairEx() 
     { 
     } 

     public KeyValuePairEx(TKey key, TValue value) 
     { 
      Key = key; 
      Value = value; 
     } 
    } 
} 

Приведенный выше код от Keyo