自定义一个可以被序列化的泛型Dictionary<TKey,TValue>集合
Dictionary是一个键值类型的集合。它有点像数组,但Dictionary的键可以是任何类型,内部使用Hash Table存储键和值。本篇自定义一个类型安全的泛型Dictionary<TKey, TValue>,并且可以被序列化。
为了使自定义的泛型Dictionary<TKey, TValue>可以被序列化成xml,需要实现泛型IXmlSerializable接口。
public class MySerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable{public System.Xml.Schema.XmlSchema GetSchema(){return null;}public void ReadXml(System.Xml.XmlReader reader){//键的xml序列化器XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));//值的xml序列化器XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));//判断xml中当前节点是否为nullbool wasEmpty = reader.IsEmptyElement;reader.Read();if (wasEmpty){return;}while (reader.NodeType != System.Xml.XmlNodeType.EndElement){//先读键reader.ReadStartElement("item");reader.ReadStartElement("key");//反序列化成键的类型TKey key = (TKey) keySerializer.Deserialize(reader);reader.ReadEndElement();//再读值reader.ReadStartElement("value");TValue value = (TValue)valueSerializer.Deserialize(reader);reader.ReadEndElement();this.Add(key, value);reader.ReadEndElement();//读下一个节点reader.MoveToContent();}reader.ReadEndElement();}public void WriteXml(System.Xml.XmlWriter writer){//键的xml序列化器XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));//值的xml序列化器XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));foreach (TKey key in this.Keys){writer.WriteStartElement("item");writer.WriteStartElement("key");keySerializer.Serialize(writer, key);writer.WriteEndElement();writer.WriteStartElement("value");TValue value = this[key];valueSerializer.Serialize(writer, value);writer.WriteEndElement();writer.WriteEndElement();}}}
客户端使用XmlWriter把Dictionary<TKey, TValue>这个泛型集合写进xml中。
class Program{static void Main(string[] args){MySerializableDictionary<int, string> mySerializableDictionary = new MySerializableDictionary<int, string>();mySerializableDictionary.Add(1,"darren");mySerializableDictionary.Add(2, "jack");using (XmlWriter writer = XmlWriter.Create("infos.xml")){writer.WriteStartDocument();writer.WriteStartElement("infos");foreach (var item in mySerializableDictionary){mySerializableDictionary.WriteXml(writer);}writer.WriteEndElement();writer.WriteEndDocument();}Console.WriteLine("写入xml成功");Console.ReadKey();}}
在Debug文件夹中可找到生成的infos.xml文件。
自定义一个可以被序列化的泛型Dictionary<TKey,TValue>集合的更多相关文章
- 使用结构struct作为Dictionary<TKey,TValue>的键
我们经常用简单数据类型,比如int作为泛型Dictionary<TKey,TValue>的key,但有时候我们希望自定义数据类型作为Dictionary<TKey,TValue> ...
- 泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List<T>,Dictionary<Tkey,Tvalue>,SortedList<Tkey,Tvalue>,Queue<T>,Stack<T>等
泛型与非泛型集合类在C#程序中是非常重要的一个基础概念,这里列一个表来进行对比: 非泛型集合类 泛型集合类 描述 ArrayList List<T> 表示具有动态大小的对象数组 Hasht ...
- C#中数组、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面对比
C#中数组.集合(ArrayList).泛型集合List<T>.字典(dictionary<TKey,TValue>)全面对比 为什么把这4个东西放在一起来说,因为c#中的这4 ...
- .NET中Dictionary<TKey, TValue>浅析
.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...
- C#编程(五十三)----------字典Dictionary<TKey,TValue>
字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须 ...
- Dictionary<TKey, TValue> 类
C# Dictionary<TKey, TValue> 类 Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.字典中的每个添加项都由一个值及 ...
- Dictionary<Tkey.TValue>与SortedList
一.概述 表示Key/Value集合,可以添加删除元素,允许按Key来访问元素.是Hashtable的泛型等效类. 它需要一个相等实现来确定键是否相等,可以使用实现了IEqualityComparer ...
- .net源码分析 – Dictionary<TKey, TValue>
接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blo ...
- C# 字典 Dictionary<Tkey,Tvalue>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来.我们都知道计算机技术发展日新月异,速度惊人的快,你我稍不留神,就会被慢慢淘汰!因此:每日不间断的学习是避免被 ...
随机推荐
- WCF使用Net.tcp绑定时候出现错误:元数据包含无法解析的引用
在WCF服务编程中,客户端添加引用服务时,出现如下错误: 元数据包含无法解析的引用:“net.tcp://192.168.1.105:1314/LoginService”. 套接字连接已中止.这可能是 ...
- vector的reserve和resize(转)
转自:http://www.cnblogs.com/qlee/archive/2011/05/16/2048026.html vector 的reserve增加了vector的capacity,但是它 ...
- SqlServer中查看索引的使用情况
--查看数据库索引的使用情况 select db_name(database_id) as N'TOPK_TO_DEV', --库名 object_name(a.object_id) as N'Top ...
- 使用Windows 2008R2中的NFS替代Samba协议,解决Windows 与Linux共享文件的问题
一.在Windows服务器上进行安装NFS服务 首先,打开服务管理器,选择添加角色: 选中文件服务,下一步: 出现一个提示,不管它,继续下一步: 在接下来的页面中选中“网络文件 ...
- React、Redux 和 Bootstrap
使用 React.Redux 和 Bootstrap 实现 Alert 今天,我们来学习使用 React.Redux 和 Bootstrap 实现Alert. 例子 这个例子实现了弹出不同类型信息的功 ...
- ubuntu14.0安装ITK的步骤
(1) sudo apt-get install cmake (2) sudo apt-get install cmake-curses-gui (3)下载安装包InsightToolkit-4.11 ...
- P1006 传纸条 多维DP
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...
- Class PropertyPlaceholderHelper的使用
1.代码 private static Properties properties = new Properties(); public static String getProperties(Str ...
- sqlite读写
#coding=utf-8 import sqlite3 import os #创建数据库和游标 if os.path.exists(' test.db'): conn=sqlite3.connect ...
- 010.MySQL-Keepalived搭配脚本04
vim /etc/keepalived/check_MySQL.sh #!/bin/bash pkill keepalived