Moin,
ich arbeite zurzeit am Laden/Speichern einer relativ umfangreichen Objekthierarchie, und ich habe mich dafür entschieden, dies über die
XML-Serialisierung ablaufen zu lassen. Größtenteils funktioniert das auch recht gut, aber es gibt einige Eigenschaften der Objekte, die nicht serialisiert werden können. Beispielsweise hat in der Hierarchie jedes Objekt eine Eigenschaft Parent, die auf sein Elternteil in der Hierarchie verweist. Würde ich diese Eigenschaft mit serialisieren lassen, hätte ich einen zirkulären Verweis und der XmlSerializer schmeißt eine Ausnahme. In .NET 2.0 hat Microsoft offenbar speziell für solche Fälle die Attribute OnDeserialized etc. eingeführt. Ich deklariere also eine Methode in der Basisklasse wie folgt:
Code:
[OnDeserialized]
internal virtual void OnDeserialized(StreamingContext context)
{
foreach (ComponentElement element in Children) {
element.Parent = this;
}
}
Diese Klassen haben jedoch allesamt keinen eigenen XmlSerializer, sondern werden über eine andere Klasse eingebunden, in der eine Liste dieser Objekte enthalten ist. Dort gibt es ebenfalls eine OnDeserialized-Methode, die auch korrekt ausgeführt wird und für die obersten Objekte in der Hierarchie eine Eigenschaft setzt. Für alle anderen Klassen, die allesamt über ein XmlIncludeAttribute eingebunden sind, wird die OnDeserialized-Methode jedoch nie aufgerufen, egal wo und wie ich sie einfüge. Jetzt meine Frage: Habe ich da irgendetwas übersehen oder wird OnDeserialized wirklich nur in der Klasse aufgerufen, für die der XmlSerializer instanziiert wurde? Ist ja nicht so schlimm, dann muss eben in dieser Klasse die Hierarchie durchlaufen werden, um die Integrität zu sichern, aber die andere Möglichkeit fände ich schöner
[Edit]
Hmm, ich fürchte, ich habe die Frage umsonst gestellt... Eine Überprüfung hat nämlich ergeben, dass auch in der Root-Klasse die OnDeserialized-Methode nicht aufgerufen wurde und die Integrität an anderer Stelle gesichert wurde... Eine Suche nach weiteren Beispielen führt mich zu der Annahme, dass der XmlSerializer diese Methoden überhaupt nicht aufrufen kann, sondern dies nur bei der BinaryFormatter-Serialisierung der Fall ist. Schade drum, weil das sehr praktisch gewesen wäre, aber wohl nicht zu ändern.
[/Edit]