Supprimer la Valeur Null Types d'Être Émis par XmlSerializer
Veuillez considérer ce qui suit Montant de la valeur de la propriété type qui est marqué comme un nullable XmlElement:
[XmlElement(IsNullable=true)]
public double? Amount { get ; set ; }
Quand nullable type de valeur est définie sur null, C# XmlSerializer résultat se présente comme suit:
<amount xsi:nil="true" />
Plutôt que émettant de cet élément, je voudrais le XmlSerializer pour supprimer l'élément complètement. Pourquoi? Nous sommes à l'aide de Authorize.NET pour les paiements en ligne et Authorize.NET rejette la demande si cet élément null existe.
La solution/solution de contournement est de ne pas sérialiser le Montant de la valeur de la propriété type. Au lieu de cela, nous avons créé une complémentaire propriété, SerializableAmount, qui est basée sur la Quantité et est sérialisé à la place. Depuis SerializableAmount est de type String, qui, comme les types de référence sont supprimées par le XmlSerializer si la valeur null par défaut, tout fonctionne très bien.
///<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); }
}
De sûr, c'est juste une solution de contournement. Est-il le moyen le plus propre pour supprimer la valeur null éléments type de l'émission?
decimal
.Bon point: floating point l'argent est le mal.
Merci d'appeler cela ainsi.
Votre solution est très bonne, je l'utilise ainsi. Cependant la réponse de Marc, c'est encore mieux...
OriginalL'auteur Ben Griswold | 2009-08-18
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter:
Il y a un certain nombre de modèles reconnus par les parties du cadre. Pour info,
XmlSerializer
cherche aussipublic bool AmountSpecified {get;set;}
.Exemple complet (commutation sur
decimal
):Plus d'informations sur ShouldSerialize* sur MSDN.
Wow, c'est ce que j'appellerais profondément obscure. Cool que vous l'avez trouvé, cependant.
Merci Marc. Maintenant que vous m'avez dit ce que vous recherchez, je crois que j'ai trouvé la référence MSDN sur XmlSerializer "propriété + indication de motif. Elle est ici: msdn.microsoft.com/en-us/library/.... Il est même difficile de trouver une fois que vous trouver la bonne référence MSDN page si vous me demandez. 🙂 Merci encore.
Hmmm... j'ai regardé, et je ne peux pas trouver quelque chose de plus officiel... toujours à la recherche.
Et voici la référence MSDN pour la ShouldSerialize modèle: msdn.microsoft.com/en-us/library/53b8022e(SV.71).aspx
OriginalL'auteur Marc Gravell
Il ya aussi une alternative pour obtenir
Utilisation
OriginalL'auteur mko
vous pouvez essayer ceci :
xml.Replace("xsi:nil=\"true\"", string.Empty);
OriginalL'auteur Nicolas Battaglia