前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XML Serializable Generic Dictionary

XML Serializable Generic Dictionary

作者头像
张善友
发布2018-01-29 11:23:54
7640
发布2018-01-29 11:23:54
举报
文章被收录于专栏:张善友的专栏张善友的专栏

    .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

    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2006-05-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档