如果class中包含List<KeyValuePair> abc property,xml不会自动seriaze 这个item。 只能得到<abc/>
根据上一篇的启发,实现了类似功能的List class, 代码如下:
- public class SeriazableList<TValue>:List<TValue>, IXmlSerializable
- {
- #region IXmlSerializable Members
- public System.Xml.Schema.XmlSchema GetSchema()
- {
- return null;
- }
- public void ReadXml(System.Xml.XmlReader reader)
- {
- XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
- bool wasEmpty = reader.IsEmptyElement;
- reader.Read();
- if (wasEmpty)
- return;
- while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
- {
- TValue value = (TValue)valueSerializer.Deserialize(reader);
- this.Add(value);
- reader.MoveToContent();
- }
- reader.ReadEndElement();
- }
- public void WriteXml(System.Xml.XmlWriter writer)
- {
- XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
- foreach (TValue value in this)
- {
- valueSerializer.Serialize(writer, value);
- }
- }
- #endregion
- }
- public struct DynamicParameter:IXmlSerializable
- {
- public string Name;
- public double Value;
- public DynamicParameter(string name, double value)
- {
- this.Name = name;
- this.Value = value;
- }
- #region IXmlSerializable Members
- public System.Xml.Schema.XmlSchema GetSchema()
- {
- return null;
- }
- public void ReadXml(System.Xml.XmlReader reader)
- {
- XmlSerializer keySerializer = new XmlSerializer(typeof(string));
- XmlSerializer valueSerializer = new XmlSerializer(typeof(double));
- bool wasEmpty = reader.IsEmptyElement;
- reader.Read();
- if (wasEmpty)
- return;
- Name = reader.Name;
- reader.ReadStartElement();
- Double.TryParse(reader.ReadString(), out Value);
- reader.ReadEndElement();
- reader.MoveToContent();
- reader.ReadEndElement();
- }
- public void WriteXml(System.Xml.XmlWriter writer)
- {
- writer.WriteStartElement(Name);
- writer.WriteValue(Value);
- writer.WriteEndElement();
- }
- #endregion
- }
两个类,一个是serialazable List, 另一个是serialazable item。
和上篇的例子相比,这样实现的Node比较紧凑。
这样生成的XML file:
- <DynamicVariables>
- <DynamicParameter>
- <OutputIndex>1</OutputIndex>
- </DynamicParameter>
- <DynamicParameter>
- <ABC>0</ABC>
- </DynamicParameter>
- <DynamicParameter>
- <DDD>30</DDD>
- </DynamicParameter>
- <DynamicParameter>
- <ABC>2</ABC>
- </DynamicParameter>
- </DynamicVariables>