说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能。感觉完全可以把这样的类封装到C#库中,很具有通用性嘛,至今没有遇到不能用的情况的说,或许出于其他方面的考虑microsoft才没有这么做。
2.SerializableDictionary自定义类
- [Serializable]
- public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
- {
- public SerializableDictionary() { }
- public void WriteXml(XmlWriter write) // Serializer
- {
- XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));
- XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));
- foreach (KeyValuePair<TKey, TValue> kv in this)
- {
- write.WriteStartElement("SerializableDictionary");
- write.WriteStartElement("key");
- KeySerializer.Serialize(write, kv.Key);
- write.WriteEndElement();
- write.WriteStartElement("value");
- ValueSerializer.Serialize(write, kv.Value);
- write.WriteEndElement();
- write.WriteEndElement();
- }
- }
- public void ReadXml(XmlReader reader) // Deserializer
- {
- reader.Read();
- XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));
- XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));
- while (reader.NodeType != XmlNodeType.EndElement)
- {
- reader.ReadStartElement("SerializableDictionary");
- reader.ReadStartElement("key");
- TKey tk = (TKey)KeySerializer.Deserialize(reader);
- reader.ReadEndElement();
- reader.ReadStartElement("value");
- TValue vl = (TValue)ValueSerializer.Deserialize(reader);
- reader.ReadEndElement();
- reader.ReadEndElement();
- this.Add(tk, vl);
- reader.MoveToContent();
- }
- reader.ReadEndElement();
- }
- public XmlSchema GetSchema()
- {
- return null;
- }
- }
3.使用
a.定义SerializableDictionary对象,这里以存储<string,string>键对为例:
- SerializableDictionary<string, string> serializableDictionary = new SerializableDictionary<string, string>();
b.添加元素
- serializableDictionary.Add("Key1", “Value1”);
- ......
c.序列化
- using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
- {
- XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>));
- xmlFormatter.Serialize(fileStream, this.serializableDictionary);
- }
注:文件名fileName自己定义,如“file.xml”
d.反序列化
- using (FileStream fileStream = new FileStream(fileName, FileMode.Open))
- {
- XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>));
- this.serializableDictionary = (SerializableDictionary<string,string>)xmlFormatter.Deserialize(fileStream);
- }