读书人

Dictionary序列化跟反序列化

发布时间: 2012-10-10 13:58:11 作者: rapoo

Dictionary序列化和反序列化

using System.Collections.Generic;using System.IO;using System.Runtime.Serialization;using System.Xml.Serialization;namespace ConsoleApplication1{    internal class Program    {        private static void Main(string[] args)        {            SerializableDictionary<string, string> obj = new SerializableDictionary<string, string>();            obj.Add("1", "1ff");            obj.Add("2", "2gg");            obj.Add("3", "3yy");            StringWriter _memory = new StringWriter();            XmlSerializer formatter = new XmlSerializer(obj.GetType());            formatter.Serialize(_memory, obj);            //_memory.Seek(0, SeekOrigin.Begin);            StringReader sr = new StringReader(_memory.ToString());            SerializableDictionary<string, string> obj2 = (SerializableDictionary<string, string>)formatter.Deserialize(sr);            _memory.Close();        }    }    /// <summary>    /// 标题:支持 XML 序列化的 Dictionary    /// </summary>    /// <typeparam name="TKey"></typeparam>    /// <typeparam name="TValue"></typeparam>    [XmlRoot("SerializableDictionary")]    public class SerializableDictionary<TKey, TValue>      : Dictionary<TKey, TValue>, IXmlSerializable    {        #region 构造函数        public SerializableDictionary()            : base()        {        }        public SerializableDictionary(IDictionary<TKey, TValue> dictionary)            : base(dictionary)        {        }        public SerializableDictionary(IEqualityComparer<TKey> comparer)            : base(comparer)        {        }        public SerializableDictionary(int capacity)            : base(capacity)        {        }        public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)            : base(capacity, comparer)        {        }        protected SerializableDictionary(SerializationInfo info, StreamingContext context)            : base(info, context)        {        }        #endregion 构造函数        #region IXmlSerializable Members        public System.Xml.Schema.XmlSchema GetSchema()        {            return null;        }        /// <summary>        /// 从对象的 XML 表示形式生成该对象        /// </summary>        /// <param name="reader"></param>        public void ReadXml(System.Xml.XmlReader reader)        {            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));            bool wasEmpty = reader.IsEmptyElement;            reader.Read();            if (wasEmpty)                return;            while (reader.NodeType != System.Xml.XmlNodeType.EndElement)            {                reader.ReadStartElement("item");                reader.ReadStartElement("key");                TKey key = (TKey)keySerializer.Deserialize(reader);                reader.ReadEndElement();                reader.ReadStartElement("value");                TValue value = (TValue)valueSerializer.Deserialize(reader);                reader.ReadEndElement();                this.Add(key, value);                reader.ReadEndElement();                reader.MoveToContent();            }            reader.ReadEndElement();        }        /**/        /// <summary>        /// 将对象转换为其 XML 表示形式        /// </summary>        /// <param name="writer"></param>        public void WriteXml(System.Xml.XmlWriter writer)        {            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));            foreach (TKey key in this.Keys)            {                writer.WriteStartElement("item");                writer.WriteStartElement("key");                keySerializer.Serialize(writer, key);                writer.WriteEndElement();                writer.WriteStartElement("value");                TValue value = this[key];                valueSerializer.Serialize(writer, value);                writer.WriteEndElement();                writer.WriteEndElement();            }        }        #endregion IXmlSerializable Members    }}

读书人网 >编程

热点推荐