2015-02-08 3 views
0

Я пишу приложение для Windows Store, которое включает сериализацию Xml-файла в словарь и наоборот. С Списком <> и ObservableCollection <>, я могу сделать это, чтобы читать из XML-файла: Слова классаC# serialize dictionary в xml-файл

public class word 
{ 
    [XmlElement("key")] 
    public string words { get; set; } 
    [XmlElement("value")] 
    public string value { get; set; } 
} 

Read класс

using System.IO; 
using Windows.Storage; 
using System.Xml.Serialization; 
using System.Collections.ObjectModel; 

ObservableCollection<word> Words = new ObservableCollection<word>; 
    public async void Load() 
     { 
      StorageFolder localFolder = Windows.Storage.KnownFolders.MusicLibrary; 
      StorageFile file = await localFolder.GetFileAsync("dictionary.xml"); 
      XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<word>)); 
      using (Stream stream = await file.OpenStreamForReadAsync()) 
      { 
       ObservableCollection<word> list = serializer.Deserialize(stream) as ObservableCollection<word>; 
       foreach (var c in list) 
       { 
        Words.Add(c); 
       } 
      } 
     } 

Но словарь <> имеет пару TKey и TValue, которые делают код выше непригодным для использования. В любом случае, чтобы исправить вышеуказанный код, подходящий для словаря <>? Любая помощь ценится.

ответ

0

Вам необходимо преобразовать каждый элемент в объект, который не является KeyValuePair. Я использую простой класс, подобный этому, для сериализации Словаря, который может быть изменен для поддержки ConcurrentDictionay или ObservableCollection.

static public class XmlDictionarySerializer<A, B> 
{ 
    public class Item 
    { 
     public A Key { get; set; } 
     public B Value { get; set; } 
    } 

    static public void Serialize(IDictionary<A, B> dictionary, string filePath) 
    { 
     List<Item> itemList = new List<Item>(); 
     foreach (A key in dictionary.Keys) 
     { 
      itemList.Add(new Item() { Key = key, Value = dictionary[key] }); 
     } 

     XmlDataSerializer.Serialize<List<Item>>(itemList, filePath); 
    } 

    static public Dictionary<A, B> DeserializeDictionary(string filePath) 
    { 
     Dictionary<A, B> dictionary = new Dictionary<A, B>(); 
     List<Item> itemList = XmlDataSerializer.Deserialize<List<Item>>(filePath); 
     foreach (Item item in itemList) 
     { 
      dictionary.Add(item.Key, item.Value); 
     } 
     return dictionary; 
    } 
}