Serearlize class like
public class ListDataModel: List<TestDatamodel>
{
public double D{get;set;}
}
to XML will not generate property D. this is the behaviour, we need to write xml reader/writer function by ourself.
here is a example.
public class TestDataModel { public double A { get; set; } public double B { get; set; } public double C { get; set; } } public class ListDataModel : List<TestDataModel> { } [XmlRoot("ListDataModelWithMore")] public class ListDataModelWithMoreProperty : List<TestDataModel>, IXmlSerializable { public double D { get; set; } public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(System.Xml.XmlReader reader) { XmlSerializer valueSerializer = new XmlSerializer(typeof(TestDataModel)); bool wasEmpty = reader.IsEmptyElement; reader.Read(); if (wasEmpty) return; XmlSerializer doubleSerializer = new XmlSerializer(typeof(double)); D = (double)doubleSerializer.Deserialize(reader); while (reader.NodeType != System.Xml.XmlNodeType.EndElement) { TestDataModel value = (TestDataModel)valueSerializer.Deserialize(reader); this.Add(value); reader.MoveToContent(); } reader.ReadEndElement(); } public void WriteXml(System.Xml.XmlWriter writer) { XmlSerializer generalSerlizer = new XmlSerializer(typeof(double)); generalSerlizer.Serialize(writer, D); XmlSerializer valueSerializer = new XmlSerializer(typeof(TestDataModel)); foreach (TestDataModel value in this) { valueSerializer.Serialize(writer, value); } } }
Test functions:
public partial class Form1 : Form { private TestDataModel dm; private ListDataModel listDM; private ListDataModelWithMoreProperty listDMWithMore; public Form1() { InitializeComponent(); dm = new TestDataModel() {A = 3.0, B = 2.5, C = 7}; listDM = new ListDataModel(); listDM.Add(dm); listDM.Add(new TestDataModel() { A = 5.0, B = 2.5, C = 9 }); listDMWithMore = new ListDataModelWithMoreProperty(); listDMWithMore.Add(dm); listDMWithMore.Add(new TestDataModel() { A = 5.0, B = 2.5, C = 9 }); listDMWithMore.D = 20; } private void button1_Click(object sender, EventArgs e) { XmlSerializer serializer = new XmlSerializer(typeof(TestDataModel)); StringBuilder xmlString = new StringBuilder(); XmlWriter writer = XmlWriter.Create(xmlString); //list serieralizer XmlSerializer listSerializer = new XmlSerializer(typeof(ListDataModel)); StringBuilder listXmlString = new StringBuilder(); XmlWriter listWriter = XmlWriter.Create(listXmlString); //list serieralizer XmlSerializer listSerializerWithMoreP = new XmlSerializer(typeof(ListDataModelWithMoreProperty)); StringBuilder listXmlStringWithMore = new StringBuilder(); XmlWriter listWriterWithMore = XmlWriter.Create(listXmlStringWithMore); try { serializer.Serialize(writer, dm); this.textBox1.Text = xmlString.ToString(); listSerializer.Serialize(listWriter, listDM); this.txtListDM.Text = listXmlString.ToString(); listSerializerWithMoreP.Serialize(listWriterWithMore, listDMWithMore); this.txtMoreProperty.Text = listXmlStringWithMore.ToString(); } finally { writer.Close(); listWriter.Close(); } } private void button2_Click(object sender, EventArgs e) { this.textBox1.Text = string.Empty; this.txtListDM.Text = string.Empty; this.txtMoreProperty.Text = string.Empty; } private void button3_Click(object sender, EventArgs e) { string dmWithMoreString = txtMoreProperty.Text; if (string.IsNullOrEmpty(dmWithMoreString)) { return; } XmlSerializer serializer = new XmlSerializer(typeof(ListDataModelWithMoreProperty)); ListDataModelWithMoreProperty dmTest = serializer.Deserialize(new StringReader(dmWithMoreString)) as ListDataModelWithMoreProperty; MessageBox.Show(dmTest.D.ToString()); } }
