说明: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<string, string> serializableDictionary = new SerializableDictionary<string, string>();  

.

 

  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.Create))  
{
XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>));
xmlFormatter.Serialize(fileStream, this.serializableDictionary);
}

龙腾一族至尊龙骑