Kann ein schreibgeschütztes Feld initialisiert werden, wenn DataContractSerializer verwendet wird?

9

DataContractSerializer ruft beim Deserialisieren keine Konstruktoren auf oder ruft Feldinitialisierungen auf:

DataContractSerializer ruft meinen Konstruktor nicht auf?

Feldinitialisierung in C # -Klasse wird beim Deserialisieren nicht ausgeführt

Festlegen des Anfangswerts einer Eigenschaft bei der Verwendung DataContractSerializer

Ist es möglich, ein readonly -Feld nach der Deserialisierung des Objekts zu initialisieren? Muss ich diese Sprachfunktion verlassen, um DataContractSerializer zu verwenden?

    
Eric J. 23.02.2012, 19:55
quelle

3 Antworten

3

Ich bin mir nicht sicher, ob das eine gute Idee ist, aber Sie können den Wert eines readonly -Feldes außerhalb des Konstruktors oder Feldinitialisierers durch Verwendung von Reflektion ändern.

Putting etwas wie:

%Vor%

in Ihrem Deserialisierungsrückruf sollte funktionieren.

    
svick 24.02.2012, 01:34
quelle
2

Ja, mit DataContractSerializer können Sie ein readonly -Feld serialisieren. Sie können sogar ein nicht- public readonly -Feld serialisieren.

%Vor%     
Jason Kresowaty 24.02.2012 01:35
quelle
0

Ich habe einen sauberen Weg gefunden, um das zu erreichen, wonach Sie suchen, ohne Ihr Design zu durchbrechen.

Wenn Sie diese Methode verwenden, stellen Sie sicher, dass Ihr Konstruktor aufgerufen und Ihr schreibgeschütztes Feld richtig eingestellt wird.

Sie müssen tatsächlich [DataMember] markierte Felder einer DataModel-Klasse serialisieren und deserialisieren.

Dadurch wird verhindert, dass unbeabsichtigtes Verhalten auftritt, da DataContractSerializer den Konstruktor beim Deserialisieren nicht aufruft.

%Vor%

Zum Deserialisieren und Serialisieren können Sie jetzt diese Klasse verwenden, um Ihre Werte zu halten.

Nach dem Laden können Sie ein neues Datenmodellobjekt erstellen und es an Ihre Klasse übergeben, deren Konstruktor aufgerufen werden muss.

%Vor%

Nach dem Speichern können Sie die erforderlichen Daten aus Ihrer Klasse extrahieren, die das ReadOnly-Feld enthalten.

%Vor%

Natürlich müssen Sie dem Konstruktor eine Überladung hinzufügen, und Sie müssen das Beispiel vielleicht ein wenig optimieren, aber ich denke, Sie haben das Bild.

    
ForceMagic 12.12.2013 01:58
quelle