Funktion bei der Deserialisierung auslösen

8

Ich habe eine Klasse mit einer Anzahl von Feldern, die normalerweise im Konstruktor aus anderen Daten in der Klasse berechnet werden. Sie werden nicht in XML serialisiert, da Änderungen an den übrigen Daten wahrscheinlich eine Neuberechnung erfordern.

Gibt es eine Möglichkeit, einen Funktionsaufruf einzurichten, der bei der Deserialisierung ausgelöst wird?

    
Tom Savage 24.05.2010, 10:07
quelle

4 Antworten

5

Was Sie beschreiben, ist [OnDeserialized]

XmlSerializer unterstützt keine Serialisierungs-Callback-Methoden (zumindest nicht in MS .NET; mono kann anders sein). Abhängig von Ihren Anforderungen können Sie versuchen, DataContractSerializer , das Serialisierungsrückrufe unterstützt (wie eine Reihe anderer Serialisierer). Andernfalls besteht die beste Vorgehensweise möglicherweise darin, nur eine eigene öffentliche Methode zu verwenden, die Sie manuell aufrufen.

Eine andere Option ist die manuelle Implementierung von IXmlSerializable , aber das ist hard .

    
Marc Gravell 24.05.2010, 10:13
quelle
1

Da ein Objekt, das XML-serialisiert werden kann, einen öffentlichen parameterlosen Konstruktor benötigt, scheint es, als hätten Sie bereits eine Lücke im Klassenentwurf, bevor Sie die XML-Serialisierung starten.

Persönlich würde ich mit der faulen Berechnung dieser Felder gehen. Speichern Sie innerhalb der Klasse ein Flag, ob Sie die Felder berechnet haben oder nicht, und legen Sie dieses Feld auf einen Wert fest, der "veraltet" bedeutet, wenn eine der Eigenschaften geändert wird, die in der Berechnung verwendet werden. Überprüfen Sie dann in den Eigenschaften, die die berechneten Werte zurückgeben, ob Sie eine Neuberechnung durchführen müssen, bevor Sie den Wert zurückgeben.

Dies würde dann unabhängig von der XML-Serialisierung funktionieren.

Beispiel:

%Vor%     
quelle
1

- Bearbeiten:

Es wurde gerade bestätigt, dass der Xml-Serialisierungsprozess nicht die 'OnDeserialized'-Attribut deklarierte Methode trifft, wie der Kommentator unten sagt. Was ist eine Schande.

- Vorherige Antwort:

Ja, sehen Sie sich hier um.

>

Von besonderem Interesse wäre das Attribut OnDeserialized , diskutiert hier .

Es ist vielleicht erwähnenswert, dass abhängig von der verwendeten Serialisierungsmethode (ich denke) Ihr no-arg-Konstruktor aufgerufen wird. Offensichtlich geschieht dies bevor etwas anderes eingestellt wird. Also ist es wahrscheinlich nicht ganz nützlich.

    
Noon Silk 24.05.2010 10:15
quelle
-3

Sie können die Schnittstelle IDeserializationCallback implementieren

    
alek.sys 24.05.2010 10:31
quelle