XMLIGNOREATTRIBUT, UNIQUEMENT UTILISÉ pendant la sérialisation, pas pendant la désérialisation?

StackOverflow https://stackoverflow.com/questions/2350453

Question

Ai-je raison de comprendre le .net XmLIGNOREATTRIBU, qui dit:

Informe la méthode sérialisée du XMLSerializer pour ne pas sérialiser le domaine public ou la valeur publique de lecture / écriture de la propriété.

ce:

  • La propriété sera désérialisée, si elle est présente dans le fichier XML?
  • La propriété ne sera pas sérialisée dans un nouveau fichier XML?

La raison pour laquelle je demande est que j'ai remplacé une propriété dans le fichier par une nouvelle avec plus d'options. L'ancienne propriété était une simple propriété booléenne, et la nouvelle est une enum. J'ai changé l'ancienne propriété afin qu'il convertit la valeur de la nouvelle propriété en valeur booléenne, selon ce que l'ancienne propriété signifiait avant d'ajouter la nouvelle, à la fois Get and Set a été implémentée.

Cela m'a permis de mettre à niveau silencieusement de nouveaux fichiers en lisant l'ancienne propriété, qui définit la nouvelle propriété, et lors de la sérialisation, la nouvelle propriété a été ajoutée.

Cependant, j'aimerais supprimer l'ancienne propriété des nouveaux fichiers XML, alors je me demandais ce qui se passerait si je le taguais avec [XmlIgnore], le vieux fichier XML désérialiserait-il correctement et lira-t-il cette propriété à partir du fichier, ou serait-elle complètement ignorée?

Sinon, le changement suivant ferait-il ce que je veux?

[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
    get { return false; }
    set {
        if (value)
            ListHandling = ListHandling.All;
    }
}

Cela retournerait faux pour tous les nouveaux objets, qui seraient ignorés car j'ai spécifié une valeur par défaut, et si elle est présente dans un ancien fichier, et défini sur true, qui changerait la propriété de listhandling, qui est la nouvelle qui est importante.

Éditer: Lors des tests, j'ai vérifié que les deux approches semblent faire ce que je veux. Je vais cependant laisser la question, car je voudrais toujours savoir si le premier comportement noté ci-dessus n'est qu'un détail d'implémentation, ou si la documentation peut être comprise de cette façon.

Était-ce utile?

La solution

Si vous marquez une propriété avec XmlIgnore, c'est ignoré. Il n'est pas pris en compte lorsque le XMLSerializer construit son assemblage de sérialisation. Par conséquent, les propriétés Xmlignore-D ne sont pas remplies pendant la désérialisation et seront laissées avec leur valeur par défaut.

Exemple de programme (pour le compilateur d'extraits):

public static void RunSnippet()
{
  XmlSerializer ser = new XmlSerializer(typeof(Fie));
  Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>")));
  WL(f.Bob == null ? "null" : "something");
}

public class Fie
{
  [XmlIgnore]
  public string Bob { get; set; }
}

La sortie de ce programme est null (et si vous supprimez Xmlignore de fie.bob, la sortie est something).

Modifier en réponse à votre modification: Ce n'est pas seulement un détail d'implémentation; C'est en effet le comportement documenté de l'attribut. De la section Remarques de les documents (Premier paragraphe): "Si vous appliquez le XMLIGNOREATTRIBUT à tout membre d'une classe, le XMLSerializer ignore le membre lors de la sérialisation ou désérialiser une instance de la classe. "(Imphase ajouté)

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