Ich versuche, einen Baum von Objekten über XML-Serialisierung zu laden, und im Moment wird es die Objekte laden und den Baum ganz glücklich erstellen. Mein Problem dreht sich um die Tatsache, dass diese Klassen eine Ebene des Auditings unterstützen. Was ich gerne tun könnte, ist eine Methode für jedes Objekt aufzurufen, nachdem es geladen wurde.Wie finden Sie heraus, wenn Sie über XML-Serialisierung geladen wurden?
Aus Gründen der Argumentation, geht ich davon aus einem sehr allgemeinen Objektbaum habe mit Klassen auf verschiedene Ebenen unterscheiden, wie:
<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>
Gibt es eine Möglichkeit, die Standard-Serializer mit (In ähnlicher Weise, dass Sie kann Methoden wie ShouldSerializeFoo
) erstellen, um zu bestimmen, wann das Laden für jedes Objekt beendet wurde?
Edit: ich, dass der offensichtliche Fall darauf hinweisen, sollte so etwas wie ein OnLoaded()
Verfahren auszusetzen, die ich Anruf nach deserialising konnte, mich schlägt als eine „schlechte Sache zu tun“ zu sein.
Edit2: Aus Gründen der Diskussion dieses mein Strom ist
Hack
„Ansatz“, die für die Grundstufe arbeitet, aber das Kind Stadt Knoten immer noch denkt, es mit Änderungen gespeichert werden muss (in der realen Welt das Objektmodell ist viel komplexer, aber das wird zumindest kompilieren, ohne die Notwendigkeit einer vollständigen Quelle)
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;
}
}
Nicht eine wirkliche Antwort, aber warum können Sie die Prüfung in der Eigenschaft get-Accessor nicht tun? – weiqure
Das Auditing befindet sich in der Eigenschaftengruppe, so dass es intern einen Datensatz speichert, der seit dem Laden geändert wurde (und daher gespeichert werden muss. Dies würde dann bedeuten, dass die Werte von ihren Standardwerten auf die tatsächlichen Werte geändert wurden). –
Entschuldigung, ich wollte Satz schreiben. – weiqure