C# SerializableDictionary序列化/反序列化
c# 序列化
2023-09-14 08:57:07 时间
说明: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# 远程唤醒(远程开机)
- c# 加壳工具推荐[通俗易懂]
- C#-GDI+中发生一般性错误的解决办法
- C#-ToolTIp和Popup简单使用
- c#未能加载文件或程序集“NPOI”或它的某一个依赖项(0x80070002)
- C#应用Newtonsoft.Json操作json[2]-反序列化不定类型详解编程语言
- c与oracle配合实现复杂数据查询游标实践(c# oracle 游标)
- C#基础之数组排序、对象大小比较实现代码
- C#绝对路径拼接相对路径的实例代码
- C#WinForm中Panel实现用鼠标操作滚动条的实例方法
- C#去除首尾字符或字符串的方法
- C#SkinEngine控件给窗体添加皮肤的方法
- C#撒列实现关键字过滤的实例
- c#之利用API函数实现动画窗体的方法详解
- 浅谈C#2.0泛型中的变化:default关键字
- c#应用事务的简单实例
- C#伪彩色处理的具体方法
- c#正反序列化XML文件示例(xml序列化)
- js模拟C#中List的简单实例
- c#对象反序列化与对象序列化示例详解
- c#泛型序列化对象为字节数组的示例
- Java,C#使用二进制序列化、反序列化操作数据
- C#实现对象XML序列化的方法
- C#运用FileInfo类实现拷贝文件的方法
- C#序列化与反序列化实例
- C#设置MDI子窗体只能弹出一个的方法
- C#中datatable序列化与反序列化实例分析