[转]C#自定义可序列化的Dictionary类型

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

 
---------------------
作者:Claude-淀
来源:CSDN
原文:https://blog.csdn.net/woaixiaozhe/article/details/7873582

posted @ 2019-06-18 09:41  想飞石头  阅读(615)  评论(0)    收藏  举报