自定义一个可以被序列化的泛型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>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来.我们都知道计算机技术发展日新月异,速度惊人的快,你我稍不留神,就会被慢慢淘汰!因此:每日不间断的学习是避免被 ...
随机推荐
- 清理电脑文件夹中的Thumbs.db文件
@echo off del f:Thumbs.db /f/s/q/a exit 对应修改磁盘号, 保存批处理文件执行即可
- Simple Web API Server in Golang (1)
To be an better Gopher, get your hands dirty. Topcoder offered a serials of challenges for learning ...
- WebApi 文档Swagger
NET WebApi 文档Swagger中度优化 本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 写在前面 在后台接口开发中,接口文 ...
- Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)
思路:把边看成点,然后每条边只能从下面的边转移过来,我们将边按照u为第一关键字,w为第二关键字排序,这样就能用线段树维护啦. #include<bits/stdc++.h> #define ...
- 启动spark集群
启动Spark集群 spark@master $ ./sbin/start-all.sh 也可以一台一台启动,先启动 master spark@master $ ./sbin/start-master ...
- Google浏览器被360劫持
最新更新!!! 新写的一个 Chrome浏览器被hao123劫持: http://www.cnblogs.com/tanrong/p/7815494.html 这两个博客结合着看吧,它们几乎包括 ...
- 【Vue实战之路】一、Vue-cli入门及Vue工程目录全解。
全面的Vue-cli学习,这一篇就够了! 一.下载 使用vue-cli前,需先安装node.js,node的安装就不赘述,不过在此需要注意: 1. node版本需在4.x以上,首推6.x以上版本(no ...
- Spring-Session实现Session共享Redis集群方式配置教程
循序渐进,由易到难,这样才更有乐趣! 概述 本篇开始继续上一篇的内容基础上进行,本篇主要介绍Spring-Session实现配置使用Redis集群,会有两种配置方式,一种是Redis-Cluster, ...
- 公钥,密钥,HTTPS详解
公钥与私钥,HTTPS详解 1.公钥与私钥原理1)鲍勃有两把钥匙,一把是公钥,另一把是私钥2)鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把.3)苏珊要给鲍勃写一封保密的信.她写完后 ...
- progress进度条的样式修改
由于公司在做的公众号上需要进度条,我就想着用progress标签,可是progress标签很难修改样式,因而在网上查询了一番. 现在总结一下. progress是H5新标签,主要用于显示进度条.由于他 ...