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: >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); }
}
Dies ist natürlich nur ein workaround. Gibt es eine bessere Möglichkeit zu unterdrücken null-Wert geben Sie Elemente aus emittiert werden?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, hinzufügen:
Gibt es eine Anzahl von mustern erkannt und von teilen des Frameworks. Zur info,
XmlSerializer
sieht auch fürpublic bool AmountSpecified {get;set;}
.Vollständiges Beispiel (auch der Wechsel zu
decimal
):Mehr Informationen auf ShouldSerialize* auf der MSDN-Website.
Wow, das ist, was ich nennen würde tief verschleiert. Cool, dass Ihr ihn gefunden habt, wenn.
Danke Marc. Nun, Sie erzählte mir was zu suchen, ich glaube, ich fand die MSDN Referenz auf XmlSerializer "- Eigenschaft + angegebene" Muster. Hier ist es: msdn.microsoft.com/en-us/library/.... Es ist auch schwer zu finden, wenn man den richtigen MSDN-Referenz-Seite, wenn Sie mich Fragen. 🙂 Vielen Dank nochmal.
Hmmm... ich habe gesucht, und ich kann nicht finden, etwas mehr offizielle... noch auf der Suche.
Und hier ist der MSDN-Referenz für die ShouldSerialize Muster: msdn.microsoft.com/en-us/library/53b8022e(VS.71).aspx
InformationsquelleAutor Marc Gravell
Gibt es auch eine alternative zu bekommen
Verwenden
InformationsquelleAutor mko
können Sie versuchen, diese :
xml.Replace("xsi:nil=\"true\"", string.Empty);
InformationsquelleAutor Nicolas Battaglia