C# Dictionary序列化/反序列化

来源:互联网 发布:开展数据库系统培训 编辑:程序博客网 时间:2024/05/23 14:00

1.说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能。感觉完全可以把这样的类封装到C#库中,很具有通用性嘛,至今没有遇到不能用的情况的说,或许出于其他方面的考虑microsoft才没有这么做。


2.SerializableDictionary自定义类

[csharp] view plaincopy
  1. [Serializable]  
  2. public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable  
  3. {  
  4.     public SerializableDictionary() { }  
  5.     public void WriteXml(XmlWriter write)       // Serializer  
  6.     {  
  7.         XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));  
  8.         XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));  
  9.   
  10.         foreach (KeyValuePair<TKey, TValue> kv in this)  
  11.         {  
  12.             write.WriteStartElement("SerializableDictionary");  
  13.             write.WriteStartElement("key");  
  14.             KeySerializer.Serialize(write, kv.Key);  
  15.             write.WriteEndElement();  
  16.             write.WriteStartElement("value");  
  17.             ValueSerializer.Serialize(write, kv.Value);  
  18.             write.WriteEndElement();  
  19.             write.WriteEndElement();  
  20.         }  
  21.     }  
  22.     public void ReadXml(XmlReader reader)       // Deserializer  
  23.     {  
  24.         reader.Read();  
  25.         XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));  
  26.         XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));  
  27.   
  28.         while (reader.NodeType != XmlNodeType.EndElement)  
  29.         {  
  30.             reader.ReadStartElement("SerializableDictionary");  
  31.             reader.ReadStartElement("key");  
  32.             TKey tk = (TKey)KeySerializer.Deserialize(reader);  
  33.             reader.ReadEndElement();  
  34.             reader.ReadStartElement("value");  
  35.             TValue vl = (TValue)ValueSerializer.Deserialize(reader);  
  36.             reader.ReadEndElement();  
  37.             reader.ReadEndElement();  
  38.             this.Add(tk, vl);  
  39.             reader.MoveToContent();  
  40.         }  
  41.         reader.ReadEndElement();  
  42.   
  43.     }  
  44.     public XmlSchema GetSchema()  
  45.     {  
  46.         return null;  
  47.     }  
  48. }  

3.使用

  a.定义SerializableDictionary对象,这里以存储<string,string>键对为例:

[csharp] view plaincopy
  1. SerializableDictionary<stringstring> serializableDictionary = new SerializableDictionary<stringstring>();  

  b.添加元素

[csharp] view plaincopy
  1. serializableDictionary.Add("Key1", “Value1”);  
  2. ......  

  c.序列化

[csharp] view plaincopy
  1. using (FileStream fileStream = new FileStream(fileName, FileMode.Create))  
  2. {  
  3.     XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<stringstring>));  
  4.     xmlFormatter.Serialize(fileStream, this.serializableDictionary);  
  5. }  
    注:文件名fileName自己定义,如“file.xml”

  d.反序列化

[csharp] view plaincopy
  1. using (FileStream fileStream = new FileStream(fileName, FileMode.Open))  
  2. {  
  3.     XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<stringstring>));  
  4.     this.serializableDictionary = (SerializableDictionary<string,string>)xmlFormatter.Deserialize(fileStream);  
  5. }  
 
原创粉丝点击