C#中字典的xml文档序列化的一个实现

来源:互联网 发布:高分数据正射校正 编辑:程序博客网 时间:2024/05/17 00:53
using System.Collections;using System.Xml;using System.Xml.Serialization;using System.IO;using System;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.Collections.Generic;using System.Text;using System.Xml.Schema;namespace SerializableDictionary{public class Test{public static String UTF8ByteArrayToString(byte[] characters)    {        UTF8Encoding encoding = new UTF8Encoding();        String constructedString = encoding.GetString(characters);        return (constructedString);    }    public static byte[] StringToUTF8ByteArray(String pXmlString)    {        UTF8Encoding encoding = new UTF8Encoding();        byte[] byteArray = encoding.GetBytes(pXmlString);        return byteArray;    } public static String SerializeObject<T>(object pObject)    {        String XmlizedString = "";        MemoryStream memoryStream = new MemoryStream();        XmlSerializer xs = new XmlSerializer(typeof(T));        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);        xs.Serialize(xmlTextWriter, pObject);        memoryStream = (MemoryStream)xmlTextWriter.BaseStream; // (MemoryStream)          XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());        return XmlizedString;    }    public static object DeserializeObject<T>(String pXmlizedString)    {        XmlSerializer xs = new XmlSerializer(typeof(T));        MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);        return xs.Deserialize(memoryStream);    }        static void Main()    {    SerializableDictionary<int, int> dict = new SerializableDictionary<int, int>();    dict.Add(1, 1);    dict.Add(2, 2);    string str = SerializeObject<dict>(dict);    StreamWriter stream = new StreamWriter("test.xml");    stream.Write(str);    stream.Close();    }}     [XmlRoot("dictionary"), Serializable]    public class SerializableDictionary<TKey, TValue>        : Dictionary<TKey, TValue>, IXmlSerializable    {        public SerializableDictionary()        {        }        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)        {        }        #region IXmlSerializable Members        public XmlSchema GetSchema()        {            return null;        }        /// <summary>        /// 从对象的 XML 表示形式生成该对象        /// </summary>        /// <param name="reader"></param>        public void ReadXml(XmlReader reader)        {            var keySerializer = new XmlSerializer(typeof(TKey));            var valueSerializer = new XmlSerializer(typeof(TValue));            bool wasEmpty = reader.IsEmptyElement;            reader.Read();            if (wasEmpty)                return;            while (reader.NodeType != XmlNodeType.EndElement)            {                reader.ReadStartElement("item");                reader.ReadStartElement("key");                var key = (TKey)keySerializer.Deserialize(reader);                reader.ReadEndElement();                reader.ReadStartElement("value");                var value = (TValue)valueSerializer.Deserialize(reader);                reader.ReadEndElement();                Add(key, value);                reader.ReadEndElement();                reader.MoveToContent();            }            reader.ReadEndElement();        }        /// <summary>        /// 将对象转换为其 XML 表示形式        /// </summary>        /// <param name="writer"></param>        public void WriteXml(XmlWriter writer)        {            var keySerializer = new XmlSerializer(typeof(TKey));            var valueSerializer = new XmlSerializer(typeof(TValue));            foreach (TKey key in 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    }}

0 0