XML Serializable Generic Dictionary

    .net 2.0 泛型Dictionary不支持 XML serializable.  下面是一个实现IXmlSerializable 接口实现支持Serialize的泛型集合.Dictionary 。 Dictionary<TKey, TValue>本身实现了ISerializable接口,WebService中无法实现序列化,具体是什么原因它不支持XML序列化。

/// <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
        #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

    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

C# 字符串操作基本过程(Equals、Compare、EndsWith等处理方法)

4022
来自专栏hbbliyong

C#基础知识回顾-- 反射(3)

获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺...

2966
来自专栏跟着阿笨一起玩NET

在C#中ParameterizedThreadStart和ThreadStart区别

901
来自专栏二进制文集

JSON Java 解析

要使程序可以运行必须引入JSON-lib包——org.json.jar包。综合来看,这个JAR包比较好用。

1612
来自专栏Java后端技术

22中编程语言的HelloWorld

791
来自专栏owent

Hash模板 个人模板

1032
来自专栏飞扬的花生

集合中随机取不重复的索引

有时候希望从一个集合中随机取n个元素不重复 那么就取到这n个数字的索引 public static int[] GetRandomArray(int Numb...

3288
来自专栏技术博客

一步一步学Linq to sql(一):预备知识

  Linq to sql(或者叫DLINQ)是LINQ(.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据...

951
来自专栏C#

C#创建安全的字典(Dictionary)存储结构

    在上面介绍过栈(Stack)的存储结构,接下来介绍另一种存储结构字典(Dictionary)。 字典(Dictionary)里面的每一个元素都是一个...

4246
来自专栏菩提树下的杨过

[原创]Func〈T, TResult〉 泛型委托 以及演变历程(整理自MSDN)

以下内容为菩提树下的杨过根据微软MSDN整理,转贴请注明出处 MSDN对于Func<T, TResult>)的官方解释: 封装一个具有一个参数并返回 ...

2187

扫码关注云+社区

领取腾讯云代金券