可序列化字典类 SerizlizableDictionary

当然要求字典的键值类型也是可序列化的。从这点看,它不同于HashTable,HashTable的值是object类型,无法被序列化。

SerizlizableDictionary.cs - 这段可序列化字典类是从网络上找的,找不到原始出处了,代码清理后如下:

using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; namespace SerializableDictionary { [XmlRoot("dictionary"), Serializable] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable { public SerializableDictionary() { } public SerializableDictionary(IDictionary<TKey, TValue> dictionary) : base(dictionary) { } public SerializableDictionary(IEqualityComparer<TKey> comparer) : base(comparer) { } public SerializableDictionary(int capacity) : base(capacity) { } public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer) : base(capacity, comparer) { } protected SerializableDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } #region IXmlSerializable Members public XmlSchema GetSchema() { return null; } /// <summary> /// 从对象的 XML 表示形式生成该对象 /// </summary> /// <param name="reader"></param> public void ReadXml(XmlReader reader) { var keySerializer = new XmlSerializer(typeof(TKey)); var valueSerializer = new XmlSerializer(typeof(TValue)); bool wasEmpty = reader.IsEmptyElement; reader.Read(); if (wasEmpty) return; while (reader.NodeType != XmlNodeType.EndElement) { reader.ReadStartElement("item"); reader.ReadStartElement("key"); var key = (TKey)keySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement("value"); var value = (TValue)valueSerializer.Deserialize(reader); reader.ReadEndElement(); Add(key, value); reader.ReadEndElement(); reader.MoveToContent(); } reader.ReadEndElement(); } /// <summary> /// 将对象转换为其 XML 表示形式 /// </summary> /// <param name="writer"></param> public void WriteXml(XmlWriter writer) { var keySerializer = new XmlSerializer(typeof(TKey)); var valueSerializer = new XmlSerializer(typeof(TValue)); foreach (TKey key in 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(); } } #endregion } }

MySerializer.cs - XML序列化器

using System; using System.IO; using System.Xml.Serialization; namespace SerializableDictionary { public static class MySerializer { /// <summary> /// 序列化对象到XML文件 /// </summary> /// <param name="fileName">文件全名</param> /// <param name="obj">对象</param> public static void SaveToXml(string fileName, object obj) { SaveToXml(fileName, obj, obj.GetType()); } /// <summary> /// 序列化某对象到本地文件 /// </summary> /// <param name="fileName">文件全名</param> /// <param name="obj">对象</param> /// <param name="type">指定对象类型</param> public static void SaveToXml(string fileName, object obj, Type type) { using (var writer = new StreamWriter(fileName)) { var xs = new XmlSerializer(type); xs.Serialize(writer, obj); } } /// <summary> /// 从XML格式文件反序列化对象 /// </summary> /// <param name="fileName">文件全名</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public static object LoadFromXml(string fileName, Type type) { using (var reader = new StreamReader(fileName)) { var xs = new XmlSerializer(type); object obj = xs.Deserialize(reader); return obj; } } } }

Program.cs - 入口函数所在类(控制台程序)

using System; using System.IO; namespace SerializableDictionary { class Program { static void Main() { const string xmlfilename = "SerizlizableDictionary.Test.xml"; //输出文件名 var dictionary = new SerializableDictionary<string, string>(); dictionary["Title"] = "可序列化字典类"; dictionary["Blog"] = new Uri("http://blog.csdn.net/oyi319/archive/2010/08/10/5801450.aspx").ToString(); dictionary["Date"] = DateTimeOffset.Now.ToString(); Console.WriteLine(new string('-', 25)); Console.WriteLine("可序列化字典演示"); Console.WriteLine(new string('-', 25)); Console.WriteLine(); Console.WriteLine("输入您的键值数据,空行结束:"); while(true) { Console.Write("\tKey,Value: "); var input = Console.ReadLine(); if(string.IsNullOrEmpty(input)) break; var splited = input.Split(','); if(splited.Length!=2) continue; dictionary[splited[0]] = splited[1]; //加入字典 } var output = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), xmlfilename); Console.WriteLine("正在序列化字典到XML文件:" + output); try { MySerializer.SaveToXml(output, dictionary, typeof (SerializableDictionary<string, string>)); //序列化为XML } catch(Exception ex) { Console.WriteLine("序列化失败!" + ex.Message); goto Exit; } Console.WriteLine("序列化字典到XML文件完成。"); Console.WriteLine("按任意键显示XML文件内容..."); Console.ReadKey(true); var xmltext = File.ReadAllText(output); //显示XML文件内容 Console.WriteLine(xmltext); Console.Write("文件结束。\n按任意键显示XML文件内容..."); Console.ReadKey(true); Console.Write("\r正在读取xml文件并反序列化为对象..."); try { var dictionary2 = (SerializableDictionary<string, string>)MySerializer.LoadFromXml(output, typeof(SerializableDictionary<string, string>)); Console.WriteLine("\r \r反序列化为对象结果:"); foreach (var o in dictionary2) Console.WriteLine("{0,10}: {1}", o.Key, o.Value); //输出结果 } catch (Exception ex) { Console.WriteLine("\n反序列化失败!" + ex.Message); goto Exit; } Exit: Console.Write("\n演示结束,按任意键退出..."); Console.ReadKey(true); } } }

演示结果:

------------------------- 可序列化字典演示 ------------------------- 输入您的键值数据,空行结束: Key,Value: name,oyi319 Key,Value: age,secret Key,Value: 正在序列化字典到XML文件:C:\Documents and Settings\Administrator\桌面\Serizlizab leDictionary.Test.xml 序列化字典到XML文件完成。 按任意键显示XML文件内容... <?xml version="1.0" encoding="utf-8"?> <dictionary> <item> <key> <string>Title</string> </key> <value> <string>可序列化字典类</string> </value> </item> <item> <key> <string>Blog</string> </key> <value> <string>http://blog.csdn.net/oyi319/archive/2010/08/10/5801450.aspx</strin g> </value> </item> <item> <key> <string>Date</string> </key> <value> <string>2010-8-10 14:39:51 +08:00</string> </value> </item> <item> <key> <string>name</string> </key> <value> <string>oyi319</string> </value> </item> <item> <key> <string>age</string> </key> <value> <string>secret</string> </value> </item> </dictionary> 文件结束。 反序列化为对象结果: Title: 可序列化字典类 Blog: http://blog.csdn.net/oyi319/archive/2010/08/10/5801450.aspx Date: 2010-8-10 14:39:51 +08:00 name: oyi319 age: secret 演示结束,按任意键退出...

---

示例下载页面:

SerializableDictionary.7z

4KB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值