Unterdrücken Null-Wert-Typen aus Emittiert Werden, die von XmlSerializer

Bitte betrachten Sie die folgende Menge Wert type-Eigenschaft, die gekennzeichnet ist als eine null XmlElement:

[XmlElement(IsNullable=true)] 
public double? Amount { get ; set ; }

Wenn eine null-value Typ auf null gesetzt ist, die C# XmlSerializer Ergebnis sieht wie folgt aus:

<amount xsi:nil="true" />

Eher als emittierende dieses element möchte ich den XmlSerializer zu unterdrücken, um das element vollständig. Warum? Wir verwenden Authorize.NET für online-Zahlungen und Authorize.NET verwirft die Anfrage, wenn das null-element vorhanden ist.

Die aktuelle Lösung/workaround nicht serialisieren Sie den Wert der Typ-Eigenschaft auf alle. Stattdessen haben wir eine komplementäre Eigenschaft, SerializableAmount, die auf Menge und serialisiert statt. Da SerializableAmount ist vom Typ String, die wie bei Referenz-Typen sind unterdrückt, von der XmlSerializer-wenn standardmäßig null, alles funktioniert Super.

///<summary>
///Gets or sets the amount.
///</summary>
[XmlIgnore]
public double? Amount { get; set; }

///<summary>
///Gets or sets the amount for serialization purposes only.
///This had to be done because setting value types to null 
///does not prevent them from being included when a class 
///is being serialized.  When a nullable value type is set 
///to null, such as with the Amount property, the result 
///looks like: &gt;amount xsi:nil="true" /&lt; which will 
///cause the Authorize.NET to reject the request.  Strings 
///when set to null will be removed as they are a 
///reference type.
///</summary>
[XmlElement("amount", IsNullable = false)]
public string SerializableAmount
{
    get { return this.Amount == null ? null : this.Amount.ToString(); }
    set { this.Amount = Convert.ToDouble(value); }
}

Dies ist natürlich nur ein workaround. Gibt es eine bessere Möglichkeit zu unterdrücken null-Wert geben Sie Elemente aus emittiert werden?

btw; "amount" (für Zahlungen) können besser sein als decimal.
Guter Punkt: floating-point-Geld ist böse.
Vielen Dank für den Aufruf, so gut.
Deine Lösung ist ganz gut, ich benutze es als gut. Aber Marc ' s Antwort ist noch besser...

InformationsquelleAutor Ben Griswold | 2009-08-18

Schreibe einen Kommentar