Рассмотрите возможность создания вспомогательного класса, который использует сериализацию XML. Это отделяет форматирование XML от дизайна основного класса, и в целом соответствует идее добавления функциональности к классам посредством композиции. (Фактически, часто хорошей идеей является сделать это таким образом, даже если вспомогательный класс не использует сериализацию XML.) Он также позволяет декларативно форматировать XML без необходимости написания большого количества процедурного кода.
Как это сделать: спроектировать вспомогательный класс таким образом, чтобы он предоставлял открытые свойства способом, который нравится XmlSerializer
, и получал эти значения из экземпляра вашего класса, который передается частному конструктору. Добавьте статическое свойство XmlSerializer
и открытый статический метод, который использует XmlSerializer
для записи данных в файл, поток или что-то еще. Что-то вроде:
[XmlRoot("MyClass")]
public class MyClassXmlWriter
{
private static XmlSerializer Serializer = new XmlSerializer(typeof MyClassXmlWriter);
public static void Write(MyClass source, Stream st)
{
Serializer.Serialize(new MyClassXmlWriter(source), st);
}
private MyClass Source;
private MyClassXmlWriter(MyClass source)
{
Source = source;
}
[XmlElement("SomeElement")]
public string SomeProperty { get { return Source.SomeProperty; } }
}
Использовать это так же просто, как:
using (FileStream fs = new FileStream(filename))
{
MyClassXmlWriter.Write(myObject, fs);
}
Обратите внимание, что если вам когда-либо потребуется реализовать десериализацию, вы просто передаете его свойства общедоступным геттерам, а затем реализуете статический метод Read
, который десериализуется в новый объект MyClassXmlWriter
, а затем создает и заполняет объект MyClass
из свойства. (Вы, вероятно, изменили бы название класса, хотя.)