c#将字典序列化为xml文件

问题描述:

我正在编写一个Windows应用商店应用,它涉及将Xml文件序列化到字典中,反之亦然。随着名单<>和的ObservableCollection <>,我可以做到这一点从XML文件中读取: 词类c#将字典序列化为xml文件

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

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的,这使得上面的代码无法使用。无论如何修复上面的代码适用于词典<>?任何帮助表示感谢。

您需要将每个项目转换为不是KeyValuePair的对象。我使用这样一个简单的类来序列化一个Dictionary,它可以很容易地被修改为支持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; 
    } 
}