C# Dictionary的xml序列化
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Xml; 7 using System.Xml.Schema; 8 using System.Xml.Serialization; 9 namespace SerialDict 10 { 11 [Serializable] 12 public class SerialDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable 13 { 14 private string name; 15 public SerialDictionary() 16 { 17 this.name = "SerialDictionary"; 18 } 19 public SerialDictionary(string name) 20 { 21 this.name = name; 22 } 23 public void WriteXml(XmlWriter write) // Serializer 24 { 25 XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey)); 26 XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue)); 27 28 29 write.WriteAttributeString("name", name); 30 31 write.WriteStartElement(name); 32 foreach (KeyValuePair<TKey, TValue> kv in this) 33 { 34 write.WriteStartElement("element"); 35 write.WriteStartElement("key"); 36 KeySerializer.Serialize(write, kv.Key); 37 write.WriteEndElement(); 38 write.WriteStartElement("value"); 39 ValueSerializer.Serialize(write, kv.Value); 40 write.WriteEndElement(); 41 write.WriteEndElement(); 42 } 43 write.WriteEndElement(); 44 } 45 public void ReadXml(XmlReader reader) // Deserializer 46 { 47 reader.Read(); 48 XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey)); 49 XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue)); 50 51 name = reader.Name; 52 reader.ReadStartElement(name); 53 while (reader.NodeType != XmlNodeType.EndElement) 54 { 55 reader.ReadStartElement("element"); 56 reader.ReadStartElement("key"); 57 TKey tk = (TKey)KeySerializer.Deserialize(reader); 58 reader.ReadEndElement(); 59 reader.ReadStartElement("value"); 60 TValue vl = (TValue)ValueSerializer.Deserialize(reader); 61 reader.ReadEndElement(); 62 reader.ReadEndElement(); 63 64 this.Add(tk, vl); 65 reader.MoveToContent(); 66 } 67 reader.ReadEndElement(); 68 reader.ReadEndElement(); 69 70 } 71 public XmlSchema GetSchema() 72 { 73 return null; 74 } 75 } 76 class Program 77 { 78 static void Main(string[] args) 79 { 80 SerialDictionary<string, uint> sd = new SerialDictionary<string, uint>("modelNextIDs"); 81 sd.Add("xxxx", 10); 82 sd.Add("xxxxx", 1); 83 sd.Add("xxxxxx", 1); 84 string fileName = "D:\\s.xml"; 85 using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) 86 { 87 XmlSerializer xmlFormatter = new XmlSerializer(sd.GetType()); 88 xmlFormatter.Serialize(fileStream, sd); 89 } 90 91 SerialDictionary<string, uint> sd2 = new SerialDictionary<string, uint>("modelNextIDs"); 92 using (FileStream fileStream2 = new FileStream(fileName, FileMode.Open)) 93 { 94 XmlSerializer xmlFormatter = new XmlSerializer(sd2.GetType()); 95 sd2 = xmlFormatter.Deserialize(fileStream2) as SerialDictionary<string, uint>; 96 } 97 } 98 } 99 }