• Dictionary 序列化与反序列化


    [转:http://blog.csdn.net/woaixiaozhe/article/details/7873582]

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

    2.SerializableDictionary自定义类

     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>键对为例:

    1 SerializableDictionary<string, string> serializableDictionary = new SerializableDictionary<string, string>();  

    b.添加元素

    1 serializableDictionary.Add("Key1", “Value1”);  

    c.序列化

    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.反序列化

    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 }  
  • 相关阅读:
    python登录csdn并自动评论下载资源脚本
    聊聊C语言的预编译指令include
    ANSI C、ISO C、Standard C联系与区别
    我对在开发板上开发程序的一些理解
    关于CMTS设备的一些备忘
    一个简单的EJB例子
    手动部署EJB于WebLogic
    eclipse+MyEclipse+WebLogic开发简单的EJB
    我对视频“分辨率”的理解以及在电视上显示的理解
    VC win32 static library静态链接库简单示例
  • 原文地址:https://www.cnblogs.com/cpcpc/p/3678785.html
Copyright © 2020-2023  润新知