2010-02-02 14 views
9

Ich habe diese Klasse:Gibt es eine Möglichkeit zu vermeiden, dass der XmlSerializer eine Null-Eigenschaft beim Deserialisieren nicht initialisiert?

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 
} 

Wenn MyList null ist, wenn MySerializableClass serialisiert ist, muss ich es null haben, wenn es zu deserialised ist, aber die XmlSerializer initialisiert es immer, wenn es meine Klasse deserialises.

Gibt es eine Möglichkeit, die Initialisierung von Null-Eigenschaften zu vermeiden?

MyList wird nicht einmal in der serialisierten Datei aufgezeichnet, wenn sie null ist. Wenn ich es mit NULL-Werten lade und erneut speichere, ist MyList nicht mehr null, es ist als Liste <> mit 0 Elementen, aber nicht null serialisiert.

Danke.

Weitere Informationen:

Eine IsDeserializing Eigenschaft aufgrund einiger Code Einschränkungen in der Struktur der Klasse nicht lebensfähig ist

+0

Wow, System.XML ergreift nie, mich zu überraschen. Einen öffentlichen Setter für ein Sammlungsklassenmitglied zu haben ist * sehr * ungewöhnlich, überprüfe dein Design, um zu überprüfen, ob du das wirklich willst. Es funktioniert ohne einen Setter in Ordnung. –

+2

Es ist nicht das, was ich wirklich will. Es ist was der Serializer will. Wenn ich entweder "get" oder "private" festlegen, schlägt der Deserializer fehl. – Carlo

Antwort

8

Das sieht aus wie ein Bug ...

Auch wenn Sie zu markieren versuchen die Eigenschaft als nullable, scheint es nicht zu funktionieren.

[XmlArray(IsNullable = true)] 
public List<MyObject> MyList { get; set; } 

Es serialisiert die MyList Eigenschaft wie folgt:

<MyList xsi:nil="true" /> 

die XML klar So zeigt an, dass die Liste leer ist, aber nach der Deserialisierung wird es nach wie vor auf eine leere Liste initialisiert ...

Wenn Sie List<MyObject> mit MyObject[] ersetzen, es funktioniert gut (auch ohne IsNullable = true), aber es ist wahrscheinlich nicht das, was Sie wollen ...

Sie sollten dies wahrscheinlich unter Connect melden.

+1

Sobald Sie den Fehler gemeldet haben, bearbeiten Sie Ihre Frage so, dass sie die URL des Fehlerberichts enthält. Das erlaubt anderen, für den Fehler zu stimmen. –

+1

Bitte stimmen Sie ab und fügen Sie einige Kommentare hier https://connect.microsoft hinzu.com/VisualStudio/feedback/details/687096/xmlserializer-initialisiert-eine-Liste-wenn-es-sollte-nicht –

0

Verwenden Sie keine automatisch implementierten Eigenschaften, wenn Sie dort eine Null benötigen. Verwendung z.B.

public class MySerializableClass 
{ 
    List<MyObject> myList 
    public List<MyObject> MyList { get {return myList;} set {myList = value;} } 
} 
+1

Das Problem nicht beheben, versuchen Sie es. –

+0

Ja, ich habe es tatsächlich so, ich habe es für das Beispiel vereinfacht, aber danke für den Vorschlag. – Carlo

0

hatte ich das gleiche Problem, aber die XmlArrayAttribute auf die Eigenschaft mit nichts hinzugefügt gesetzt machte es

public class MySerializableClass 
{ 
    [XmlArray] 
    public List<MyObject> MyList { get; set; } 
} 
+0

Funktioniert nicht für mich! –

0

für mich arbeiten Wenn Sie eine Eigenschaft mit dem Namen hinzufügen * Property * als boolean Angegebene des XmlSerializer rendert das Tag für die Liste nur, wenn es wahr ist.

Beispiel:

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 

    [XmlIgnore] 
    public bool MyListSpecified { get; set; } 
} 
+0

Funktioniert nicht, in 4.0 versucht – annakata