zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    第一章Struts1
    Java
    论坛入口forum.php
    【Discuz系列教程2】论坛入口forum.php
    【Discuz系列教程3】核心函数class_core.php
    discuz 系统函数库function_core注释
    java 每日习题(四)求101-200之间的素数
    java 每日习题(三)兔子问题
    java 每日习题(二) 用decimalFormat格式化输出
    java 每日习题(一)
  • 原文地址:https://www.cnblogs.com/itelite/p/2662065.html
Copyright © 2011-2022 走看看