BTW, this is a distilled example of the problem - I need to implement IXmlSerializable as I have to hook up some event handlers following deserialization.
Thanks in advance, sorry for long code!
Expand|Select|Wrap|Line Numbers
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Xml.Serialization;
- using System.Xml;
- using System.IO;
- namespace SerializationTest
- {
- class Program
- {
- static void Main(string[] args)
- {
- Data[] input = new Data[3];
- input[0] = new Data("one");
- input[1] = new Data("two");
- input[2] = new Data("three");
- Holder holder = new Holder("holder1");
- holder.DataSeries = input;
- TextWriter writer = new StreamWriter("E:\\Stuff\\test.xml");
- XmlSerializer sz = new XmlSerializer(typeof (Holder));
- sz.Serialize(writer, holder);
- writer.Flush();
- writer.Close();
- FileStream reader = File.OpenRead("E:\\Stuff\\test.xml");
- XmlSerializer sz2 = new XmlSerializer(typeof (Holder));
- Holder result = (Holder) sz2.Deserialize(reader);
- Console.WriteLine("Number of data objects in series: {0}", result.DataSeries.Length);
- reader.Close();
- }
- }
- [Serializable]
- public class Holder
- {
- private string _name;
- private Data[] _dataSeries;
- public Holder() { }
- public Holder(string name)
- {
- _name = name;
- }
- [XmlAttribute("HolderName")]
- public string Name
- {
- get { return _name; }
- set { _name = value; }
- }
- [XmlArray]
- public Data[] DataSeries
- {
- get { return _dataSeries; }
- set { _dataSeries = value; }
- }
- }
- [Serializable]
- public class Data : IXmlSerializable
- {
- private string _dataName;
- public Data() { }
- public Data(string name)
- {
- _dataName = name;
- }
- public string DataName
- {
- get { return _dataName; }
- set { _dataName = value; }
- }
- #region IXmlSerializable Members
- public System.Xml.Schema.XmlSchema GetSchema()
- {
- return null;
- }
- public void ReadXml(XmlReader reader)
- {
- reader.ReadToFollowing("DataName");
- _dataName = reader.ReadElementContentAsString("DataName", string.Empty);
- }
- public void WriteXml(XmlWriter writer)
- {
- writer.WriteElementString("DataName", _dataName);
- }
- #endregion
- }
- }