C# Dictionary序列化/反序列化
来源:互联网 发布:软件使用授权书模板 编辑:程序博客网 时间:2024/06/11 22:58
1.说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能。感觉完全可以把这样的类封装到C#库中,很具有通用性嘛,至今没有遇到不能用的情况的说,或许出于其他方面的考虑microsoft才没有这么做。
2.SerializableDictionary自定义类
[Serializable] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable { public SerializableDictionary() { } public void WriteXml(XmlWriter write) // Serializer { XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue)); foreach (KeyValuePair<TKey, TValue> kv in this) { write.WriteStartElement("SerializableDictionary"); write.WriteStartElement("key"); KeySerializer.Serialize(write, kv.Key); write.WriteEndElement(); write.WriteStartElement("value"); ValueSerializer.Serialize(write, kv.Value); write.WriteEndElement(); write.WriteEndElement(); } } public void ReadXml(XmlReader reader) // Deserializer { reader.Read(); XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue)); while (reader.NodeType != XmlNodeType.EndElement) { reader.ReadStartElement("SerializableDictionary"); reader.ReadStartElement("key"); TKey tk = (TKey)KeySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement("value"); TValue vl = (TValue)ValueSerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadEndElement(); this.Add(tk, vl); reader.MoveToContent(); } reader.ReadEndElement(); } public XmlSchema GetSchema() { return null; } }
3.使用
a.定义SerializableDictionary对象,这里以存储<string,string>键对为例:
SerializableDictionary<string, string> serializableDictionary = new SerializableDictionary<string, string>();
b.添加元素
serializableDictionary.Add("Key1", “Value1”);......
c.序列化
using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) { XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>)); xmlFormatter.Serialize(fileStream, this.serializableDictionary); }注:文件名fileName自己定义,如“file.xml”
d.反序列化
using (FileStream fileStream = new FileStream(fileName, FileMode.Open)) { XmlSerializer xmlFormatter = new XmlSerializer(typeof(SerializableDictionary<string, string>)); this.serializableDictionary = (SerializableDictionary<string,string>)xmlFormatter.Deserialize(fileStream); }
- C# Dictionary序列化/反序列化
- C# Dictionary序列化/反序列化
- 序列化及反序列化Dictionary
- C#里 如何序列化与反序列化 hashtable Dictionary及C#连接mysql数据库
- DataContractJsonSerializer反序列化Dictionary
- c#序列化与反序列化
- c# 序列化和反序列化
- C#序列化和反序列化
- C#序列化和反序列化
- C#序列化与反序列化
- C#序列化和反序列化
- c#序列化和反序列化
- C#序列化和反序列化
- C#序列化和反序列化
- C# - 序列化和反序列化
- C#序列化和反序列化
- C#序列化与反序列化
- C#序列化和反序列化
- nvl函数
- ACM的小技巧
- vc try catch捕捉所有异常的问题
- if条件里有两个 或 (||) 符号
- 单元测试与main前运行函数__attribute__((constructor))关键字
- C# Dictionary序列化/反序列化
- ReportViewer 嵌套子报表
- K.Teamwork Brings Profits! 典型的dfs搜索
- 在操作数据库时候出现 sqlite3_open_v2("/data/data/xxx/databases/xxx.db", &handle, 6)failed
- oracle 怎么查看一个数据库中有几个表空间?以及这些表空间的名字?
- 为什么要去火星
- sql server 2000更新技巧&select 查询中带参数,游标中使用exec
- chromium的gdb
- ftl语法