序列化Dictionary属性到XML里

原创 2011年01月21日 18:07:00

<ComponentSettings>
<ComponentOne>
<SettingOne>SettingOneValue</SettingOne>
<SettingTwo>SettingTwoValue</SettingTwo>
</ComponentOne>
<ComponentTwo>
<AnotherSettingOne>AnotherSettingOneValue</AnotherSettingOne>
<AnotherSettingTwo>AnotherSettingTwoValue</AnotherSettingTwo>
</ComponentTwo>
</ComponentSettings>

 

Dictionary本身支持Serialization。key,value都是Serializable
不能直接xml序列化, 转化成list再序列化

 

 

可以从Dictionary泛型类派生并实现IXmlSerializable

C# code
public class ComponentsProperties : Dictionary<string, Dictionary<string,string>>, System.Xml.Serialization.IXmlSerializable { #region IXmlSerializable Members public System.Xml.Schema.XmlSchema GetSchema() { throw new NotImplementedException(); } public void ReadXml(System.Xml.XmlReader reader) { if (reader.IsEmptyElement) return; reader.Read(); while (reader.NodeType != System.Xml.XmlNodeType.EndElement) { string key = reader.Name; this[key] = new Dictionary<string, string>(); if (!reader.IsEmptyElement) { reader.ReadStartElement(); while (reader.NodeType != System.Xml.XmlNodeType.EndElement) this[key][reader.Name] = reader.ReadElementString(); } reader.Read(); } } public void WriteXml(System.Xml.XmlWriter writer) { foreach (string key in this.Keys) { writer.WriteStartElement(key); foreach (string key1 in this[key].Keys) writer.WriteElementString(key1, this[key][key1]); writer.WriteEndElement(); } } #endregion }


调用时候的写法和原来是一样的,例如:
C# code
public class TestClass { [XmlElement("ComponentSettins")] public ComponentsProperties Settings { get; set; } } void DoTest() { TestClass test = new TestClass(); test.Settings = new ComponentsProperties(); test.Settings["ComponentOne"] = new Dictionary<string, string>(); test.Settings["ComponentOne"]["SettingOne"] = "SettingOneValue"; test.Settings["ComponentOne"]["SettingTwo"] = "SettingTwoValue"; test.Settings["ComponentTwo"] = new Dictionary<string, string>(); test.Settings["ComponentTwo"]["AnotherSettingOne"] = "AnotherSettingOneValue"; test.Settings["ComponentTwo"]["AnotherSettingTwo"] = "AnotherSettingTwoValue"; XmlSerializer xs = new XmlSerializer(typeof(TestClass)); FileStream fs = new FileStream(@"d:/test.xml", FileMode.Create); xs.Serialize(fs, test); fs.Close(); }

==========================================================================
  1. /// <summary>  
  2.     /// 支持XML序列化的泛型 Dictionary  
  3.     /// </summary>  
  4.     /// <typeparam name="TKey"></typeparam>  
  5.     /// <typeparam name="TValue"></typeparam>  
  6.     [XmlRoot("SerializableDictionary")]  
  7.     public class SerializableDictionary<TKey, TValue>  
  8.         : Dictionary<TKey, TValue>, IXmlSerializable  
  9.     {  
  10.  
  11.         #region 构造函数  
  12.         public SerializableDictionary()  
  13.             : base()  
  14.         {  
  15.         }  
  16.         public SerializableDictionary(IDictionary<TKey, TValue> dictionary)  
  17.             : base(dictionary)  
  18.         {  
  19.         }  
  20.   
  21.         public SerializableDictionary(IEqualityComparer<TKey> comparer)  
  22.             : base(comparer)  
  23.         {  
  24.         }  
  25.   
  26.         public SerializableDictionary(int capacity)  
  27.             : base(capacity)  
  28.         {  
  29.         }  
  30.         public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)  
  31.             : base(capacity, comparer)  
  32.         {  
  33.         }  
  34.         protected SerializableDictionary(SerializationInfo info, StreamingContext context)  
  35.             : base(info, context)  
  36.         {  
  37.         }  
  38.         #endregion  
  39.         #region IXmlSerializable Members  
  40.         public System.Xml.Schema.XmlSchema GetSchema()  
  41.         {  
  42.             return null;  
  43.         }  
  44.         /// <summary>  
  45.         /// 从对象的 XML 表示形式生成该对象  
  46.         /// </summary>  
  47.         /// <param name="reader"></param>  
  48.         public void ReadXml(System.Xml.XmlReader reader)  
  49.         {  
  50.             XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));  
  51.             XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));  
  52.             bool wasEmpty = reader.IsEmptyElement;  
  53.             reader.Read();  
  54.             if (wasEmpty)  
  55.                 return;  
  56.             while (reader.NodeType != System.Xml.XmlNodeType.EndElement)  
  57.             {  
  58.                 reader.ReadStartElement("item");  
  59.                 reader.ReadStartElement("key");  
  60.                 TKey key = (TKey)keySerializer.Deserialize(reader);  
  61.                 reader.ReadEndElement();  
  62.                 reader.ReadStartElement("value");  
  63.                 TValue value = (TValue)valueSerializer.Deserialize(reader);  
  64.                 reader.ReadEndElement();  
  65.                 this.Add(key, value);  
  66.                 reader.ReadEndElement();  
  67.                 reader.MoveToContent();  
  68.             }  
  69.             reader.ReadEndElement();  
  70.         }  
  71.   
  72.         /**/  
  73.         /// <summary>  
  74.         /// 将对象转换为其 XML 表示形式  
  75.         /// </summary>  
  76.         /// <param name="writer"></param>  
  77.         public void WriteXml(System.Xml.XmlWriter writer)  
  78.         {  
  79.             XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));  
  80.             XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));  
  81.             foreach (TKey key in this.Keys)  
  82.             {  
  83.                 writer.WriteStartElement("item");  
  84.                 writer.WriteStartElement("key");  
  85.                 keySerializer.Serialize(writer, key);  
  86.                 writer.WriteEndElement();  
  87.                 writer.WriteStartElement("value");  
  88.                 TValue value = this[key];  
  89.                 valueSerializer.Serialize(writer, value);  
  90.                 writer.WriteEndElement();  
  91.                 writer.WriteEndElement();  
  92.             }  
  93.         }  
  94.         #endregion  
  95.     }  

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C# 解决Dictionary不能序列化

//Dictionary不支持序列化和反序列化,自定义一个继承自Dictionary, IXmlSerializable的类来实现。 using System; using System.Co...

C# Dictionary序列化/反序列化

1.说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能。感觉完全可以把这样的类封装到C#库中,...

xml对象转换成Dictionary或者list

对于xml对象有时候要转换成字典对象更容易读取和操作,而字典对象有个问题,就是不能有重复的键,所以对于这种情况就用list来代替,一下为代码 /// /// xml文...

使用自定义属性实现Java和.net的XML序列化

在.net中的编码规范中属性首字母都是大写的,而java的首字母是小写的,这就导致两个系统的交互,有人说xml不是通用了吗,这个倒是事实,但是java序列化后的xml流,在.net的系统中,都出现大小...

反序列化带属性和值的xml节点集合

解析XML如下,需要取得Location节点的值和属性 http://pavo.elongstatic.com...

struts2之使用JSON插件实现Ajax(在struts.xml中处理要序列化的属性)

struts2之使用JSON插件实现Ajax(在struts.xml中处理要序列化的属性)
  • fhd001
  • fhd001
  • 2011-04-22 13:52
  • 4328

C#.NET解析XML(使用属性控制 XML 序列化)

今天需要解析一个XML,这个XML和一般情况用.NET的序列化出来的格式不太一样。 我就又补习了一下。 分享一下学习成果吧。 示例代码下载: http://download.csdn.net/...
  • bdstjk
  • bdstjk
  • 2012-01-19 14:32
  • 25401

Dictionary序列化

VB.NET Imports System Imports System.Collections.Generic Imports System.Runtime.Serialization I...

创建一个可以序列化的Dictionary类

最近在调试项目的发现了一个错误,错误提示如下 反射类型“StockImageManage.Setting”时出错。 {"无法序列化 System.Collections.Generic.Dicti...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)