C# Dictionary序列化/反序列化
阿新 • • 發佈:2018-12-26
1.說明: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.序列化
注:檔名fileName自己定義,如“file.xml”using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) { XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>)); xmlFormatter.Serialize(fileStream, this.serializableDictionary); }
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); }