1. 程式人生 > >C# Dictionary序列化/反序列化

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