XML-Serialisierung und DefaultValue ("") verwandtes Problem in c #

8

Meine Klasseneigenschaft hat einen Standardwert, der serialisiert wird.

%Vor%

Also erstellen wir eine Instanz der DeclaredValue-Klasse und stellen einen Wert für die Reference2-Eigenschaft bereit und weisen nichts für Amount zu. Wenn wir also die Klasse DeclaredValue serialisieren, wird in meinem XML-Code kein Tag für den Betrag gefunden. Ich erwähne Standardwert für den Betrag "999" dann warum es nicht in der Serialisierung funktioniert. Ich möchte, dass, wenn nichts für die Menge zuweisen dann Amoun-Tag sollte in meinem XML mit Standardwert sein.

Um dies zu tun, muss ich die Eigenschaft menge so dekorieren, dass sie nach der Serialisierung immer mit dem Standardwert in XML geliefert wird, wenn der Benutzer dieser Eigenschaft nichts zuweist.

führe mir bitte, was ich im Code ändern muss, um meine gewünschte Ausgabe zu erhalten.

    
Mou 04.05.2011, 10:43
quelle

4 Antworten

15

Nach dem Hinweis auf MSDN :

  

Ein DefaultValueAttribute verursacht nicht   ein Mitglied automatisch sein   initialisiert mit den Attributen   Wert. Sie müssen den Anfangswert festlegen   in deinem Code.

Etwas überraschend regelt der DefaultValue nur das Schreiben eines Objekts, Member, die ihrem DefaultValue entsprechen, werden nicht ausgegeben.

Sie müssen immer noch Mitglieder vor oder nach dem Laden selbst initialisieren, zum Beispiel im Konstruktor.

    
Henk Holterman 04.05.2011, 10:52
quelle
7

Lassen Sie mich ausführlich beschreiben, was passiert.

Wenn die Deserialize () -Methode von XmlSerializer aufgerufen wird, erstellt sie ein neues Objekt mit einem Standardkonstruktor. Es wendet keine DefaultValueAttributes auf dieses Objekt an, da ich davon ausgehe, dass default ctor "besser wissen" sollte, wie man Werte standardmäßig initialisiert. Unter diesem Gesichtspunkt - es ist logisch.

XmlSerializer serialisiert Mitglieder nicht, deren Werte mit denen des DefaultValue-Attributs übereinstimmen. In gewisser Hinsicht wird dieses Verhalten auch von der Logik bestimmt.

Aber wenn Sie Mitglieder in ctor nicht initialisieren und die deserialize -Methode aufrufen, sieht XmlSerializer kein entsprechendes xml-Feld, aber es sieht, dass das Feld / property DefaultValueAttribute hat, Serializer einfach diesen Wert lassen (gemäß die Annahme, dass der Standardkonstruktor besser weiß, wie man eine Klasse "per Default" initialisiert. Und du hast deine Nullen.

Lösung Um eine Klassenmitglieder mit diesen DefaultValueAttributes zu initialisieren (manchmal ist es sehr praktisch, diese Initialisierungswerte gerade an Ort und Stelle zu haben), können Sie eine solche einfache Methode verwenden:

%Vor%

Diese "public void LoadDefaults ()" kann als Erweiterung für ein Objekt eingerichtet werden oder als statische Methode einer Hilfsklasse verwendet werden.

    
MajesticRa 23.05.2011 13:17
quelle
1

Wie Henk Holterman erwähnt hat, legt dieses Attribut den Standardwert nicht automatisch fest. Sein Zweck besteht hauptsächlich darin, von visuellen Designern verwendet zu werden, um eine Eigenschaft auf ihren Standardwert zurückzusetzen.

    
Thomas Levesque 04.05.2011 10:57
quelle
0

Wie bereits erwähnt, initialisiert das DefaultValue -Attribut die Eigenschaft nicht. Sie können eine einfache Schleife verwenden, um alle Eigenschaften festzulegen:

%Vor%

Obwohl ?.Value null zurückgeben könnte, funktioniert es mit nicht nullbaren Typen, ich habe das getestet.

Wenn nur wenige Ihrer Eigenschaften einen Standardwert haben, sollten Sie vielleicht nur den Wert festlegen, wenn dieser vorhanden ist.

Wenn alle Eigenschaften einen Standardwert haben sollten, entfernen Sie die ? , um einen Fehler zu erhalten, wenn Sie einen vergessen haben.

Höchstwahrscheinlich funktionieren Arrays nicht, siehe die Lösung von MajesticRa.

    
maf-soft 28.09.2016 12:13
quelle