Hier ist meine Klasse:
%Vor%Wenn ich ein Objekt dieser Klasse serialisieren:
%Vor%Es wird wie erwartet gedruckt (xml-Header und Standard-MS-Namespaces werden weggelassen):
%Vor%Als ich dieses XML genommen habe und versucht habe, es zu deserialisieren, bin ich festgefahren, weil es immer "Nicht null" ausgibt:
%Vor%Wie erzwinge Deserializer, um meine Liste null zu machen, wenn es in xml null ist?
Ach, nervig ist es nicht. Sie können dies sehen, indem Sie sgen.exe in Ihrer Assembly mit den Optionen / keep und / debug ausführen, damit Sie den Deserialisierungscode debuggen können. Es sieht ungefähr so aus:
%Vor%Nicht weniger als 3 Stellen, an denen sichergestellt wird, dass die @ To-Eigenschaft nicht null ist. Die erste ist etwas vertretbar, schwer zu deserialisieren Daten, wenn die Struktur nicht existiert. Der zweite macht den Null-Test wieder , das ist der einzige wirklich gute. Die dritte ist das Problem, ReadNull () hat true zurückgegeben, aber es noch erstellt einen Nicht-Null-Eigenschaftswert.
Wenn Sie zwischen leer und null unterscheiden wollen, dann haben Sie keine gute Lösung, aber bearbeiten Sie diesen Code von Hand. Tun Sie dies nur, wenn Sie wirklich verzweifelt sind und die Klasse zu 100% stabil ist. Tue es nicht. João's Lösung ist die einzig gute.
Ich stimme @ Oliver's Kommentar zu, aber Sie können es so lösen, wenn Sie es absolut brauchen, um null zurückzugeben. Erstellen Sie anstelle einer automatischen Eigenschaft ein eigenes Hintergrundfeld.
%Vor% Wenn Sie wirklich benötigen, dass eine Sammlung zu null
deserialisiert wird, wenn keine Werte zur Verfügung gestellt werden, können Sie dies tun, indem Sie keinen set
-Accessor wie folgt bereitstellen:
Tags und Links arrays c# xml serialization nullable