Я пытаюсь загрузить дерево объектов через сериализацию XML, и на данный момент он будет загружать объекты и создавать дерево довольно счастливо. Моя проблема связана с тем, что эти классы поддерживают уровень аудита. То, что я хотел бы сделать, это вызвать некоторый метод для каждого объекта после его загрузки.
Для аргумента предположим, что у меня есть довольно общее дерево объектов с разными классами на разных уровнях, например:
<Customer name="Foo Bar Inc.">
<Office IsHq="True">
<Street>123 Any Street</Street>
<Town name="Anytown">
<State name="Anystate">
<Country name="My Country" />
</State>
</Town>
</Office>
<Office IsHq="False">
<Street>456 High Street</Street>
<Town name="Anycity">
<State name="Anystate">
<Country name="My Country" />
</State>
</Town>
</Office>
</Customer>
Можно ли использовать сериализаторы по умолчанию (аналогично тому, как вы можете создавать такие методы, как ShouldSerializeFoo
), чтобы определить, когда загрузка завершена для каждого объекта?
Edit:
Я должен указать, что очевидный случай разоблачения чего-то, похожего на метод OnLoaded()
, который я мог бы назвать после десериализации, нападает на меня как на "плохую вещь".
Edit2:
Для обсуждения это мой текущий hack "подход", который работает на базовом уровне, но ребенок City node все еще считает, что он должен быть сохранен с изменениями (в реальном мире объектная модель намного сложнее, но это, по крайней мере, будет скомпилировано без необходимости полного источника)
public class Office
{
[XmlAttribute("IsHq")]
public bool IsHeadquarters { get; set; }
[XmlElement]
public string Street { get; set; }
[XmlElement]
public Town Town { get; set; }
protected virtual void OnLoaded() {}
public static OfficeCollection Search()
{
OfficeCollection retval = new OfficeCollection();
string xmlString = @"
<Office IsHq='True'>
<Street>123 Any Street</Street>
<Town name='Anytown'>
<State name='Anystate'>
<Country name='My Country' />
</State>
</Town>
</Office>";
XmlSerializer xs = new XmlSerializer(retval.GetType());
XmlReader xr = new XmlTextReader(xmlString);
retval = (OfficeCollection)xs.Deserialize(xr);
foreach (Office thisOffice in retval)
{
thisOffice.OnLoaded();
}
return retval;
}
}