C# Dictionary序列化/反序列化

来源:互联网 发布:软件使用授权书模板 编辑:程序博客网 时间:2024/06/11 22:58

1.说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能。感觉完全可以把这样的类封装到C#库中,很具有通用性嘛,至今没有遇到不能用的情况的说,或许出于其他方面的考虑microsoft才没有这么做。


2.SerializableDictionary自定义类

    [Serializable]    public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable    {        public SerializableDictionary() { }        public void WriteXml(XmlWriter write)       // Serializer        {            XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));            XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));            foreach (KeyValuePair<TKey, TValue> kv in this)            {                write.WriteStartElement("SerializableDictionary");                write.WriteStartElement("key");                KeySerializer.Serialize(write, kv.Key);                write.WriteEndElement();                write.WriteStartElement("value");                ValueSerializer.Serialize(write, kv.Value);                write.WriteEndElement();                write.WriteEndElement();            }        }        public void ReadXml(XmlReader reader)       // Deserializer        {            reader.Read();            XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));            XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));            while (reader.NodeType != XmlNodeType.EndElement)            {                reader.ReadStartElement("SerializableDictionary");                reader.ReadStartElement("key");                TKey tk = (TKey)KeySerializer.Deserialize(reader);                reader.ReadEndElement();                reader.ReadStartElement("value");                TValue vl = (TValue)ValueSerializer.Deserialize(reader);                reader.ReadEndElement();                reader.ReadEndElement();                this.Add(tk, vl);                reader.MoveToContent();            }            reader.ReadEndElement();        }        public XmlSchema GetSchema()        {            return null;        }    }

3.使用

  a.定义SerializableDictionary对象,这里以存储<string,string>键对为例:

SerializableDictionary<string, string> serializableDictionary = new SerializableDictionary<string, string>();

  b.添加元素

serializableDictionary.Add("Key1", “Value1”);......

  c.序列化

            using (FileStream fileStream = new FileStream(fileName, FileMode.Create))            {                XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>));                xmlFormatter.Serialize(fileStream, this.serializableDictionary);            }
    注:文件名fileName自己定义,如“file.xml”

  d.反序列化

            using (FileStream fileStream = new FileStream(fileName, FileMode.Open))            {                XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>));                this.serializableDictionary = (SerializableDictionary<string,string>)xmlFormatter.Deserialize(fileStream);            }