2010-02-12 10 views
7

Ho aggiunto alcuni tipi di valori nullable alla mia classe serializzabile. Eseguo una serializzazione utilizzando XmlSerializer ma quando il valore è impostato su null, ottengo un nodo vuoto con xsi:nil="true". Questo è il comportamento corretto che ho trovato a Xsi:nil Attribute Binding Support.Prevent <xsi: nil = "true"> su Nullable Value Types durante la serializzazione in XML

C'è un modo per disattivare questa opzione in modo che non venga emesso nulla quando il tipo di valore è null?

risposta

3

Ho avuto lo stesso problema .. qui è uno dei posti che ho letto sulla gestione di tipi di valore nullable durante la serializzazione di XML: http://stackoverflow.com/questions/244953/serialize-a-nullable-int

accennano sull'utilizzo di modelli built-in come la creazione di ulteriori proprietà per il valore nullable tipi. come per una proprietà denominata

public int? ABC 

è necessario aggiungere sia public bool ShouldSerializeABC() {return ABC.HasValue;} o pubblico bool ABCSpecified { get { return ABC.HasValue; } }

avevo solo la serializzazione di XML per inviare a uno SQL stored proc, quindi anche a me ha evitato di cambiare le mie classi. Sto facendo un controllo [not(@xsi:nil)] su tutti gli elementi nullable nella mia query .value().

+0

ho semplicemente messo in una fase intermedia per eseguire la scansione del codice XML dopo che è stato serializzato e rimuovere eventuali 'xsi: nil = "true"' nodi. – Ryall

+0

roger che. Grazie! – Chin

3

Ho trovato che il bool pubblico ABCSpecified era l'unico che funzionava con .NET 4.0. Ho anche dovuto aggiungere il XmlIgnoreAttribute

Qui è stata la mia soluzione completa per sopprimere una stringa denominata ABC nel file di riferimento Web Resource.cs:

// backing fields 
private string abc; 
private bool abcSpecified; // Added this - for client code to control its serialization 

// serialization of properties 
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] 
public string ABC 
{ 
    get 
    { 
     return this.abc; 
    } 
    set 
    { 
     this.abc= value; 
    } 
} 

// Added this entire property procedure 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool ABCSpecified 
{ 
    get 
    { 
     return this.abcSpecified; 
    } 
    set 
    { 
     this.abcSpecified = value; 
    } 
} 
+0

XmlIgnoreAttribute su una proprietà "Specificata" non è necessario, così come un setter sulla stessa proprietà. –

1

Tutti i metodi meta come specificati o ShouldSerialize è solo un cattivo progetto di programmazione della struttura XML microsoft .Net. Diventa ancora più complicato se non si ha accesso diretto alle classi che si desidera serializzare.

Nel loro metodo di serializzazione dovrebbero semplicemente aggiungere un attributo come "ignoreNullable".

La mia soluzione attuale serializza l'xml e quindi rimuove tutti i nodi che hanno nil = "true" utilizzando la seguente funzione.

+0

Onestamente, Microsoft può spingerlo per non averci fornito un'opzione facile per rimuovere l'output di nil = "true". Ecco un'idea, Microsoft. Se la proprietà viene omessa, dovrebbe essere considerata nulla. Grazie per questa presentazione. È un peccato che roba come questa debba essere fatta perché Microsoft è così arrogante. – crush

0

Questa è probabilmente la risposta meno sofisticata, ma l'ho risolta per me con una semplice stringa sostitutiva.

.Replace ("xsi: nil = \" true \ "", "");

Sto serializzando a stringa prima comunque. Posso salvare in un file più tardi.

Mantiene intatte tutte le mie XmlWriterSettings. Un'altra soluzione che ho trovato il suo pasticciato fino :)

private static string Serialize<T>(T details) 
    { 
     var serializer = new XmlSerializer(typeof(T)); 
     using (var ms = new MemoryStream()) 
     { 
      var settings = new XmlWriterSettings 
      { 
       Encoding = Encoding.GetEncoding("ISO-8859-1"), 
       NewLineChars = Environment.NewLine, 
       ConformanceLevel = ConformanceLevel.Document, 
       Indent = true, 
       OmitXmlDeclaration = true 
      }; 

      using (var writer = XmlWriter.Create(ms, settings)) 
      { 
       serializer.Serialize(writer, details); 
       return Encoding.UTF8.GetString(ms.ToArray()).Replace(" xsi:nil=\"true\" ", ""); 
      } 
     } 
    } 
Problemi correlati