SerializableDictionary

  1  using System;
  2  using System.Runtime.Serialization;
  3  using System.Xml;
  4  using System.Xml.Serialization;
  5  using System.Collections.Generic;
  6  using System.Text;
  7 
  8  namespace Sample
  9 {
 10     [Serializable()]
 11      public  class SerializableDictionary<TKey, TVal> : Dictionary<TKey, TVal>, IXmlSerializable, ISerializable
 12     {
 13          #region Constants
 14          private  const  string DictionaryNodeName =  " Dictionary ";
 15          private  const  string ItemNodeName =  " Item ";
 16          private  const  string KeyNodeName =  " Key ";
 17          private  const  string ValueNodeName =  " Value ";
 18          #endregion
 19          #region Constructors
 20          public SerializableDictionary()
 21         {
 22         }
 23 
 24          public SerializableDictionary(IDictionary<TKey, TVal> dictionary)
 25             :  base(dictionary)
 26         {
 27         }
 28 
 29          public SerializableDictionary(IEqualityComparer<TKey> comparer)
 30             :  base(comparer)
 31         {
 32         }
 33 
 34          public SerializableDictionary( int capacity)
 35             :  base(capacity)
 36         {
 37         }
 38 
 39          public SerializableDictionary(IDictionary<TKey, TVal> dictionary, IEqualityComparer<TKey> comparer)
 40             :  base(dictionary, comparer)
 41         {
 42         }
 43 
 44          public SerializableDictionary( int capacity, IEqualityComparer<TKey> comparer)
 45             :  base(capacity, comparer)
 46         {
 47         }
 48 
 49          #endregion
 50          #region ISerializable Members
 51 
 52          protected SerializableDictionary(SerializationInfo info, StreamingContext context)
 53         {
 54              int itemCount = info.GetInt32( " ItemCount ");
 55              for ( int i =  0; i < itemCount; i++)
 56             {
 57                 KeyValuePair<TKey, TVal> kvp = (KeyValuePair<TKey, TVal>)info.GetValue(String.Format( " Item{0} ", i),  typeof(KeyValuePair<TKey, TVal>));
 58                  this.Add(kvp.Key, kvp.Value);
 59             }
 60         }
 61 
 62          void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
 63         {
 64             info.AddValue( " ItemCount "this.Count);
 65              int itemIdx =  0;
 66              foreach (KeyValuePair<TKey, TVal> kvp  in  this)
 67             {
 68                 info.AddValue(String.Format( " Item{0} ", itemIdx), kvp,  typeof(KeyValuePair<TKey, TVal>));
 69                 itemIdx++;
 70             }
 71         }
 72 
 73          #endregion
 74          #region IXmlSerializable Members
 75 
 76          void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
 77         {
 78              // writer.WriteStartElement(DictionaryNodeName);
 79               foreach (KeyValuePair<TKey, TVal> kvp  in  this)
 80             {
 81                 writer.WriteStartElement(ItemNodeName);
 82                 writer.WriteStartElement(KeyNodeName);
 83                 KeySerializer.Serialize(writer, kvp.Key);
 84                 writer.WriteEndElement();
 85                 writer.WriteStartElement(ValueNodeName);
 86                 ValueSerializer.Serialize(writer, kvp.Value);
 87                 writer.WriteEndElement();
 88                 writer.WriteEndElement();
 89             }
 90              // writer.WriteEndElement();
 91          }
 92 
 93          void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
 94         {
 95              if (reader.IsEmptyElement)
 96             {
 97                  return;
 98             }
 99 
100              //  Move past container
101               if (!reader.Read())
102             {
103                  throw  new XmlException( " Error in Deserialization of Dictionary ");
104             }
105 
106              // reader.ReadStartElement(DictionaryNodeName);
107               while (reader.NodeType != XmlNodeType.EndElement)
108             {
109                 reader.ReadStartElement(ItemNodeName);
110                 reader.ReadStartElement(KeyNodeName);
111                 TKey key = (TKey)KeySerializer.Deserialize(reader);
112                 reader.ReadEndElement();
113                 reader.ReadStartElement(ValueNodeName);
114                 TVal value = (TVal)ValueSerializer.Deserialize(reader);
115                 reader.ReadEndElement();
116                 reader.ReadEndElement();
117                  this.Add(key, value);
118                 reader.MoveToContent();
119             }
120              // reader.ReadEndElement();
121 
122             reader.ReadEndElement();  //  Read End Element to close Read of containing node
123          }
124 
125         System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
126         {
127              return  null;
128         }
129 
130          #endregion
131          #region Private Properties
132          protected XmlSerializer ValueSerializer
133         {
134              get
135             {
136                  if (valueSerializer ==  null)
137                 {
138                     valueSerializer =  new XmlSerializer( typeof(TVal));
139                 }
140                  return valueSerializer;
141             }
142         }
143 
144          private XmlSerializer KeySerializer
145         {
146              get
147             {
148                  if (keySerializer ==  null)
149                 {
150                     keySerializer =  new XmlSerializer( typeof(TKey));
151                 }
152                  return keySerializer;
153             }
154         }
155          #endregion
156          #region Private Members
157          private XmlSerializer keySerializer =  null;
158          private XmlSerializer valueSerializer =  null;
159          #endregion
160     }
161 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值