开发中经常碰到要序列化Dictionary对象,但Dictionary类本身不支持序列化,所需要继承Dictionary类并实现IXmlSerializable接口。
代码:
using
System;
using
System.Collections.Generic;
using
System.Runtime.Serialization;
using
System.Xml;
using
System.Xml.Schema;
using
System.Xml.Serialization;
namespace
Lmsoft.Collections.Generic
...
{ /**/ /// <summary> /// 支持XML序列化的泛型Dictionary类 /// </summary> /// <typeparam name="TKey"></typeparam> /// <typeparam name="TValue"></typeparam> [XmlRoot( " Dictionary " )] 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 IXmlSerializable 接口的实现 #region IXmlSerializable 接口的实现 public XmlSchema GetSchema() ... { throw new NotImplementedException(); } /**/ /// <summary> /// 从对象的XML表示形式生成该对象 /// </summary> /// <param name="reader"></param> public void ReadXml(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 != XmlNodeType.EndElement) ... { 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.MoveToContent(); } reader.ReadEndElement(); } /**/ /// <summary> /// 将对象转换为其XML表示形式 /// </summary> /// <param name="writer"></param> public void WriteXml(XmlWriter writer) ... { XmlSerializer keySerializer = new XmlSerializer( typeof (TKey)); XmlSerializer valueSerializer = new XmlSerializer( typeof (TValue)); foreach (TKey key in this .Keys) ... { writer.WriteStartElement( " Key " ); keySerializer.Serialize(writer, key); writer.WriteEndElement(); writer.WriteStartElement( " Value " ); TValue value = this [key]; valueSerializer.Serialize(writer, value); writer.WriteEndElement(); } } #endregion } }