Bitte beachten Sie die folgenden Betrag Werttyp Eigenschaft, die als Nullable-XmlElement gekennzeichnet:Unterdrückt Null Wertetypen von durch XmlSerializer ausgesendet wird
[XmlElement(IsNullable=true)]
public double? Amount { get ; set ; }
Wenn ein Nullable-Wertetyp auf null gesetzt wird, werden die C# XmlSerializer Ergebnis aussieht wie das Folgende:
Anstatt dieses Element zu emittieren, möchte ich, dass der XmlSerializer das Element vollständig unterdrückt. Warum? Wir verwenden Authorize.NET für Online-Zahlungen und Authorize.NET lehnt die Anfrage ab, wenn dieses Nullelement existiert.
Die aktuelle Lösung/Problemumgehung besteht darin, die Eigenschaft Betrag Werttyp überhaupt nicht zu serialisieren. Stattdessen haben wir eine komplementäre Eigenschaft, SerializableAmount, erstellt, die auf Amount basiert und stattdessen serialisiert wird. Da SerializableAmount vom Typ String ist, die wie Referenztypen vom XmlSerializer unterdrückt werden, wenn standardmäßig null, funktioniert alles gut.
/// <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: >amount xsi:nil="true" /< 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); }
}
Natürlich ist dies nur ein Workaround. Gibt es eine sauberere Möglichkeit, die Ausgabe von Elementen vom Typ Nullwert zu unterdrücken?
btw; "Betrag" (für Zahlungen) kann besser als "dezimal" sein. –
Guter Punkt: Fließkomma Geld ist böse. –
@Marc Danke, dass du das auch rausrufst. –