繁体   English   中英

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

[英]c# serialize dictionary into xml file

我正在编写一个Windows Store App,其中涉及将Xml文件序列化为字典,反之亦然。 使用List <>和ObservableCollection <>,我可以这样做以从XML文件读取:Word Class

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);
                }
            }
        }

但是Dictionary <>具有一对TKey和TValue,这使得上面的代码无法使用。 无论如何要修复上面的代码以适合Dictionary <>? 任何帮助都很感激。

您需要将每个项目转换为不是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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM