• C# SerializableDictionary序列化/反序列化


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

    2.SerializableDictionary自定义类

    [csharp] view plain copy
     
    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>键对为例:

    [csharp] view plain copy
     
    1. SerializableDictionary<string, string> serializableDictionary = new SerializableDictionary<string, string>();  

      b.添加元素

    [csharp] view plain copy
     
    1. serializableDictionary.Add("Key1", “Value1”);  
    2. ......  

      c.序列化

    [csharp] view plain copy
     
    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.反序列化

    [csharp] view plain copy
     
      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. }  
  • 相关阅读:
    并发编程之多线程理论
    僵尸进程和孤儿进程
    并发编程之多进程
    并发编程之多进程理论
    操作系统介绍
    面向对象和网络编程练习题
    网络编程——socket编程
    面向对象练习题
    面向对象软件开发实战
    异常处理
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/5269358.html
Copyright © 2020-2023  润新知