2010-02-02 5 views
9

Ho questa classe:C'è un modo per evitare che XmlSerializer non inizializzi una proprietà nulla durante la deserializzazione?

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

Se MyList è nullo quando MySerializableClass è serializzato, ho bisogno di avere nullo quando è deserialised troppo, ma il XmlSerializer inizializza sempre quando deserialises mia classe.

C'è un modo per evitare l'inizializzazione delle proprietà nulle?

MyList non viene nemmeno registrata nel file serializzato quando è null. Quando lo carico con valori null e lo salvo di nuovo, MyList non è più nullo, è serializzato come Elenco <> con 0 elementi, ma non null.

Grazie.

Maggiori informazioni:

proprietà

Un IsDeserializing non è praticabile a causa di alcune restrizioni di codice nella struttura della classe

+0

Wow, System.Xml non coglie di sorprendermi. Avere un setter pubblico per un membro della classe raccolta è * molto * insolito, rivedere il tuo progetto per verificare che è ciò che desideri veramente. Funziona bene senza un setter. –

+2

Non è quello che voglio veramente. È ciò che vuole il serializzatore. Se faccio il get o set privato, il deserializzatore fallirà. – Carlo

risposta

8

Questo appare come un insetto ...

Anche se si tenta di segnare la proprietà come nullable, non sembra funzionare.

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

E serializza la proprietà MyList come segue:

<MyList xsi:nil="true" /> 

Così l'XML indica chiaramente che la lista è nullo, ma dopo la deserializzazione, è ancora inizializzato ad una lista vuota ...

Se si sostituisce List<MyObject> con MyObject[], funziona benissimo (anche senza IsNullable = true), ma non è probabilmente quello che volete ...

Probabilmente dovresti segnalarlo su Connect.

+1

Una volta segnalato il bug, modifica la tua domanda per includere l'URL del bug report. Ciò consentirà agli altri di votare per il bug. –

+1

Si prega di votare e aggiungere alcuni commenti qui https://connect.microsoft.it/VisualStudio/feedback/dettagli/687096/xmlserializer-initializes-a-list-when-it-not –

0

Non utilizzare le proprietà di implementazione automatica se è necessario un valore null. usare per es.

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

Non risolve il problema, provalo. –

+0

Sì, in realtà ce l'ho, l'ho semplificato per l'esempio, ma grazie per il suggerimento. – Carlo

0

Ho avuto lo stesso problema, ma aggiungendo il XmlArrayAttribute alla proprietà con niente set ha reso il lavoro per me

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

Non funziona per me! –

0

Se si aggiunge una proprietà con il nome PropertyName * * specificato come un valore booleano il XmlSerializer renderà il tag per la lista solo quando è vero.

Esempio:

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

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

Non funziona, provato in 4.0 – annakata

Problemi correlati