Dictionary 序列化与反序列化

[转:http://blog.csdn.net/woaixiaozhe/article/details/7873582]

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

2.SerializableDictionary自定义类

 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>键对为例:

1 SerializableDictionary<string, string> serializableDictionary = new SerializableDictionary<string, string>();  

b.添加元素

1 serializableDictionary.Add("Key1", “Value1”);  

c.序列化

1 using (FileStream fileStream = new FileStream(fileName, FileMode.Create))  
2 {  
3     XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>));  
4     xmlFormatter.Serialize(fileStream, this.serializableDictionary);  
5 }  

 注:文件名fileName自己定义,如“file.xml”

d.反序列化

1 using (FileStream fileStream = new FileStream(fileName, FileMode.Open))  
2 {  
3     XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>));  
4     this.serializableDictionary = (SerializableDictionary<string,string>)xmlFormatter.Deserialize(fileStream);  
5 }  

 

posted @ 2014-04-21 17:08  cpcpc  阅读(2088)  评论(0编辑  收藏  举报