Example of Seriazable List

 如果class中包含List<KeyValuePair> abc property,xml不会自动seriaze 这个item。 只能得到<abc/>

根据上一篇的启发,实现了类似功能的List class, 代码如下:

  1. public class SeriazableList<TValue>:List<TValue>, IXmlSerializable
  2.     {
  3.         #region IXmlSerializable Members
  4.         public System.Xml.Schema.XmlSchema GetSchema()
  5.         {
  6.             return null;
  7.         }
  8.         public void ReadXml(System.Xml.XmlReader reader)
  9.         {
  10.             XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
  11.             bool wasEmpty = reader.IsEmptyElement;
  12.             reader.Read();
  13.             if (wasEmpty)
  14.                 return;
  15.             while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
  16.             {
  17.                 TValue value = (TValue)valueSerializer.Deserialize(reader);
  18.                 this.Add(value);
  19.                 reader.MoveToContent();
  20.             }
  21.             reader.ReadEndElement();
  22.         }
  23.         public void WriteXml(System.Xml.XmlWriter writer)
  24.         {
  25.             XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
  26.             foreach (TValue value in this)
  27.             {
  28.                 valueSerializer.Serialize(writer, value);
  29.             }  
  30.         }
  31.         #endregion
  32.     }
  33.     public struct DynamicParameter:IXmlSerializable
  34.     {
  35.         public string Name;
  36.         public double Value;
  37.         public DynamicParameter(string name, double value)
  38.         {
  39.             this.Name = name;
  40.             this.Value = value;
  41.         }
  42.         #region IXmlSerializable Members
  43.         public System.Xml.Schema.XmlSchema GetSchema()
  44.         {
  45.             return null;
  46.         }
  47.         public void ReadXml(System.Xml.XmlReader reader)
  48.         {
  49.             XmlSerializer keySerializer = new XmlSerializer(typeof(string));
  50.             XmlSerializer valueSerializer = new XmlSerializer(typeof(double));
  51.             bool wasEmpty = reader.IsEmptyElement;
  52.             reader.Read();
  53.             if (wasEmpty)
  54.                 return;
  55.             Name = reader.Name;
  56.             reader.ReadStartElement();
  57.             Double.TryParse(reader.ReadString(), out Value);
  58.             reader.ReadEndElement();
  59.             reader.MoveToContent();
  60.             reader.ReadEndElement();
  61.         }
  62.         public void WriteXml(System.Xml.XmlWriter writer)
  63.         {
  64.             writer.WriteStartElement(Name);
  65.             writer.WriteValue(Value);
  66.             writer.WriteEndElement();
  67.         }
  68.         #endregion
  69.     }

两个类,一个是serialazable List, 另一个是serialazable item。

和上篇的例子相比,这样实现的Node比较紧凑。

这样生成的XML file:

  1. <DynamicVariables>
  2.   <DynamicParameter>
  3.     <OutputIndex>1</OutputIndex> 
  4.   </DynamicParameter>
  5.   <DynamicParameter>
  6.     <ABC>0</ABC> 
  7.   </DynamicParameter>
  8.   <DynamicParameter>
  9.     <DDD>30</DDD> 
  10.   </DynamicParameter>
  11.   <DynamicParameter>
  12.     <ABC>2</ABC> 
  13.   </DynamicParameter>
  14. </DynamicVariables>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值