说明: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. foreach (KeyValuePair<TKey, TValue> kv in this)
  10. {
  11. write.WriteStartElement("SerializableDictionary");
  12. write.WriteStartElement("key");
  13. KeySerializer.Serialize(write, kv.Key);
  14. write.WriteEndElement();
  15. write.WriteStartElement("value");
  16. ValueSerializer.Serialize(write, kv.Value);
  17. write.WriteEndElement();
  18. write.WriteEndElement();
  19. }
  20. }
  21. public void ReadXml(XmlReader reader)       // Deserializer
  22. {
  23. reader.Read();
  24. XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));
  25. XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));
  26. while (reader.NodeType != XmlNodeType.EndElement)
  27. {
  28. reader.ReadStartElement("SerializableDictionary");
  29. reader.ReadStartElement("key");
  30. TKey tk = (TKey)KeySerializer.Deserialize(reader);
  31. reader.ReadEndElement();
  32. reader.ReadStartElement("value");
  33. TValue vl = (TValue)ValueSerializer.Deserialize(reader);
  34. reader.ReadEndElement();
  35. reader.ReadEndElement();
  36. this.Add(tk, vl);
  37. reader.MoveToContent();
  38. }
  39. reader.ReadEndElement();
  40. }
  41. public XmlSchema GetSchema()
  42. {
  43. return null;
  44. }
  45. }

3.使用

a.定义SerializableDictionary对象,这里以存储<string,string>键对为例:

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

b.添加元素

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

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. }

C# SerializableDictionary序列化/反序列化的更多相关文章

  1. php json与xml序列化/反序列化

    在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记 简单数组js ...

  2. 序列化反序列化api(入门级)

    定义: java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 为什么字符串通常也会进行序列化? 对象需要进行序列化的原因:保证对象的状态不变 ...

  3. python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理

    python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...

  4. C#之你懂得的序列化/反序列化

    前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”.虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样 ...

  5. springboot学习(三)——http序列化/反序列化之HttpMessageConverter

    以下内容,如有问题,烦请指出,谢谢! 上一篇说掉了点内容,这里补上,那就是springmvc的http的序列化/反序列化,这里简单说下如何在springboot中使用这个功能. 使用过原生netty ...

  6. java序列化反序列化深入探究

    When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...

  7. java序列化反序列化深入探究(转)

    When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...

  8. C# XML序列化/反序列化参考

    .NET提供了很不错的XML序列化/反序列化器,(它们所在的命名空间为System.Xml.Serialization)这是很方便的,下面对它的使用做一些总结,以供参考. 1,简单序列化 public ...

  9. 二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

    前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: /// <summary> /// 反序列化对象 /// </summary> /// <typ ...

随机推荐

  1. Asp.net 定时写入文本记录

    Asp.net 定时写入文本记录 public static string FileAddress = "c:\\TimerLog.txt"; protected void Pag ...

  2. Install GTK in Ubuntu

    reference: http://www.cnblogs.com/niocai/archive/2011/07/15/2107472.html 一.安装 1.安装gcc/g++/gdb/make 等 ...

  3. C#中var类型

    var关键字是C#3.0新增的特性,当你不能确定自己需要使用的类型时,可以选择使用var var可以代替任何类型,var关键字指示编译器根据初始化语句右侧表达式推断变量类型 例: int a = 2 ...

  4. 如何一行jquery代码写出tab标签页(链式操作)

    啦啦!今天又学了一招,js写几十行的tab标签页jquery写一行就行啦,用到了链式操作!以下是代码: <!DOCTYPE html> <html lang="en&quo ...

  5. Java的基本数据类型

    java的基本数据类型是四类八种: 整型 byte  1字节  8位 short 2字节 16位 int 4字节 32位 long   8字节 64位 在hibernate自动映射中会根据数字长度,选 ...

  6. Java编程思想读书笔记--第21章并发

    1.基本的线程机制 定义任务 public class LiftOff implements Runnable{ protected int countDown = 10; private stati ...

  7. Java语言----三种循环语句的区别

    ------- android培训.java培训.期待与您交流! ---------- 第一种:for循环 循环结构for语句的格式:       for(初始化表达式;条件表达式;循环后的操作表达式 ...

  8. 在Windows下基于libx264.a的Qt 4.8.2视频压缩

    1.在用mingw 4.5.2编译x264后,生成libx264.a文件,将libx264.a和x264.h和x264_config.h拷贝到Qt工程中,将mingw/lib/libpthread.a ...

  9. CAS原理

    JDK5之前Java是靠synchronized关键字保证同步,这种机制存在以下问题: 在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题 一个线程持有锁会导致其他需要此锁的 ...

  10. 【HeadFirst设计模式】9.迭代器与组合模式

    迭代器: 定义: 提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示.(不让你知道我内部是如何聚合的) 把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和实现,也让责任 ...