Как вы узнаете, когда вы были загружены через сериализацию XML?
Я пытаюсь загрузить дерево объектов с помощью 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()
метод, который яcould вызов после десериализации показался мне "плохим делом".
Edit2: Ради обсуждения это мой нынешнийhack «подход», который работает для базового уровня, но дочерний узел Сити по-прежнему считает, что его необходимо сохранить с изменениями (в реальном мире объектная модель намного сложнее, но по крайней мере она будет компилироваться без необходимости для полного источника)
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;
}
}