支持 XML 序列化的 Dictionary

本文介绍了一个使用C#实现的可序列化为XML的Dictionary类,支持多种构造方法,并实现了从XML读取和写入的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Xml.Serialization;
  6 using System.Xml;
  7 using System.Xml.Schema;
  8 using System.Runtime.Serialization;
  9 
 10     /// <summary>
 11     /// 标题:支持 XML 序列化的 Dictionary
 12     /// </summary>
 13     /// <typeparam name="TKey"></typeparam>
 14     /// <typeparam name="TValue"></typeparam>
 15     [XmlRoot("SerializableDictionary")]
 16     public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
 17     {
 18 
 19         public SerializableDictionary()
 20             : base()
 21         {
 22         }
 23         public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
 24             : base(dictionary)
 25         {
 26         }
 27 
 28         public SerializableDictionary(IEqualityComparer<TKey> comparer)
 29             : base(comparer)
 30         {
 31         }
 32 
 33         public SerializableDictionary(int capacity)
 34             : base(capacity)
 35         {
 36         }
 37         public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
 38             : base(capacity, comparer)
 39         {
 40         }
 41         protected SerializableDictionary(SerializationInfo info, StreamingContext context)
 42             : base(info, context)
 43         {
 44         }
 45 
 46 
 47         public System.Xml.Schema.XmlSchema GetSchema()
 48         {
 49             return null;
 50         }
 51         /// <summary>
 52         /// 从对象的 XML 表示形式生成该对象
 53         /// </summary>
 54         /// <param name="reader"></param>
 55         public void ReadXml(System.Xml.XmlReader reader)
 56         {
 57             XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
 58             XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
 59             bool wasEmpty = reader.IsEmptyElement;
 60             reader.Read();
 61             if (wasEmpty)
 62                 return;
 63             while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
 64             {
 65                 reader.ReadStartElement("item");
 66                 reader.ReadStartElement("key");
 67                 TKey key = (TKey)keySerializer.Deserialize(reader);
 68                 reader.ReadEndElement();
 69                 reader.ReadStartElement("value");
 70                 TValue value = (TValue)valueSerializer.Deserialize(reader);
 71                 reader.ReadEndElement();
 72                 this.Add(key, value);
 73                 reader.ReadEndElement();
 74                 reader.MoveToContent();
 75             }
 76             reader.ReadEndElement();
 77         }
 78 
 79         /**/
 80         /// <summary>
 81         /// 将对象转换为其 XML 表示形式
 82         /// </summary>
 83         /// <param name="writer"></param>
 84         public void WriteXml(System.Xml.XmlWriter writer)
 85         {
 86             XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
 87             XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
 88             foreach (TKey key in this.Keys)
 89             {
 90                 writer.WriteStartElement("item");
 91                 writer.WriteStartElement("key");
 92                 keySerializer.Serialize(writer, key);
 93                 writer.WriteEndElement();
 94                 writer.WriteStartElement("value");
 95                 TValue value = this[key];
 96                 valueSerializer.Serialize(writer, value);
 97                 writer.WriteEndElement();
 98                 writer.WriteEndElement();
 99             }
100         }
101 
102     }

 

转载于:https://www.cnblogs.com/ziranquliu/p/4661317.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值