Question

J'ai une propriété définie comme suit:

[XmlArray("delete", IsNullable = true)]
[XmlArrayItem("contact", typeof(ContactEvent)),
 XmlArrayItem("sms", typeof(SmsEvent))]
public List<Event> Delete { get; set; }

Si la liste < > Supprimer ne contient aucun élément

<delete />

est émis. Si la liste & Lt; & Gt; Supprimer est défini sur null

<delete xsi:nil="true" />

est émis. Existe-t-il un moyen d’utiliser des attributs pour que l’élément delete ne soit pas émis si la collection ne contient aucun élément?

Greg - Parfait merci, je n'ai même pas lu l'isNullable la documentation a simplement supposé que cela le signalait comme non requis.

Rob Cooper - J'essayais d'éviter ISerializable, mais la suggestion de Gregs travaux. J'ai rencontré le problème que vous avez décrit dans (1), j'ai cassé un tas de code en renvoyant simplement null si la collection avait une longueur nulle. Pour contourner ce problème, j'ai créé une classe EventsBuilder (la classe que je sérialise s'appelle des événements), qui gère la totalité de la durée de vie / création des objets sous-jacents de la classe Events qui crache nos classes d'événements pour la sérialisation.

Était-ce utile?

La solution

Si vous définissez IsNullable = false ou si vous le supprimez (il est faux par défaut), alors le " delete " L'élément ne sera pas émis. Cela ne fonctionnera que si la collection est égale à null.

Je suppose qu'il existe une confusion entre & "nullable &"; en termes de .NET et celui lié aux éléments nullables en XML - ceux qui sont marqués par l'attribut xml: nil. La propriété XmlArrayAttribute.IsNullable contrôle ce dernier.

Autres conseils

J'ai eu le même problème où je ne voulais pas qu'un élément soit envoyé si le champ est vide ou 0. Le XML généré ne peut pas utiliser xsi: null = & Quot; true & Quot; (à dessein).

J'ai lu quelque part que si vous incluez une propriété de type bool avec le même nom que le champ que vous voulez contrôler mais que vous avez ajouté 'Spécifié', XMLSerializer vérifiera la valeur de retour de cette propriété pour déterminer si la propriété correspondante est utilisée. champ doit être inclus.

Pour ce faire sans implémenter IXMLSerializer:

public List<Event> Delete { get; set; }
[XMLIgnore]
public bool DeleteSpecified
{
 get
 {
   bool isRendered = false;
   if (Delete != null)
   {
     isRendered = (Delete.Count > 0);
   } 

   return isRendered;
 }
 set
 {
 }
}

Tout d'abord, je dirais: demandez-vous & "; Qu'est-ce que la sérialisation? &";.

XmlSerializer fait exactement ce qu'il est censé faire, en conservant l'état actuel de l'objet en XML. Maintenant, je ne suis pas sûr de savoir pourquoi le comportement actuel n’est pas & "Right &"; pour vous, car si vous avez initialisé la liste, elle est initialisée.

Je pense que vous avez trois options ici:

  1. Ajoutez du code dans la zone de lecture pour renvoyer null si la collection contient 0 élément. Cela risque de gâcher le code que vous avez.
  2. Implémentez l'interface IXmlSerializable et faites tout le travail vous-même.
  3. S'il s'agit d'un processus courant, vous pouvez consulter ma question & Sérialisation XML et types hérités & Quot; - Oui, je sais que cela traite d'un autre problème, mais cela vous montre comment créer une classe de sérialisation intermédiaire générique qui peut ensuite être & "Enfilée sur &"; pour permettre l’encapsulation d’un processus de sérilisation. Vous pouvez créer une classe similaire pour redéfinir le processus par défaut des collections null / zero-item.

J'espère que cela vous aidera.

Vous pouvez toujours implémenter IXmlSerializer et effectuer la sérialisation manuellement.

Voir http://www.codeproject.com/KB/cs/IXmlSerializable. aspx pour un exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top