Ignorer une propriété lors de la sérialisation xml mais pas lors de la desérialisation

dans C#, Comment faire pour que XmlSerializer ignore une propriété pendant la sérialisation mais pas pendant la deserialisation? (Ou comment faire la même chose avec Json.net?)

pour empêcher une propriété d'être sérialisée, vous pouvez ajouter le XmlIgnore l'attribut:

[XmlIgnore]
public int FooBar {get;set;}

cela va causer le <FooBar> balise à omettre lors de la sérialisation.

cependant, cela signifie aussi que le <FooBar> la balise sera ignorée lors de la désérialisation.

Dans mon cas, j'accepte une tableau d'éléments de l'utilisateur dans la requête, et pour chaque élément de l'utilisateur peut spécifier une action bien s'ils veulent ajouter, de modifier ou de supprimer l'élément. Je veux utiliser le même objet model pour obtenir des appels de liste, et je ne veux pas retourner cette propriété d'action. Je m'attends à ce serait plutôt le cas.

un Autre cas d'utilisation: dites que vous avez un objet cercle

public class Circle
{
    public double Radius { get; set; }
}

et vous le Modifiez pour ajouter une propriété diameter

public class Circle2
{
    public double Diameter { get; set; }
    public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }
}

Vous pouvez sérialiser seul le diamètre, mais être encore en mesure de desérialiser les fichiers xml dans l'ancien format qui ne contiennent que le rayon.

j'ai fait des recherches et n'ai rien trouvé, d'où cette question

Solution: j'ai trouvé la solution. Je peux ajouter une propriété ShouldSerialize qui renvoie toujours false, détails à cette documentation MSDN

(cette solution pourrait être ajouté comme une réponse réelle si cette question est à nouveau ouvert)

35
demandé sur Jrabauer 2013-08-15 01:06:47

2 réponses

si vous voulez ignorer l'élément lors de la sérialisation avec XmlSerializer, vous pouvez utiliser XmlAttributeOverrides:

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = true;
attribs.XmlElements.Add(new XmlElementAttribute("YourElementName"));
overrides.Add(typeof(YourClass), "YourElementName", attribs);

XmlSerializer ser = new XmlSerializer(typeof(YourClass), overrides);
ser.Serialize(...
20
répondu fcuesta 2013-08-14 21:21:46

C'est la solution décrite par Manoj:

Si vous souhaitez supprimer la sérialisation d'une propriété spécifique Foo, mais encore être en mesure de désérialiser, vous pouvez ajouter une méthode public bool ShouldSerializeFoo() qui retourne toujours false.

Exemple:

public class Circle2
{
    public double Diameter { get; set; }
    public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }

    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public bool ShouldSerializeRadius() {return false;}
}

cela va causer le rayon de ne pas être sérialisé, mais permet quand même de le désérialiser.

cette méthode doit être publique pour que XMLSerializer la trouve, donc pour éviter de polluer l'espace de noms vous pouvez ajouter l' EditorBrowsable attribut pour le cacher de L'IDE. Malheureusement, cette dissimulation ne fonctionne que si l'assemblée est référencée comme DLL dans votre projet actuel, mais pas si vous éditez le projet actuel avec ce code.

24
répondu HugoRune 2014-03-05 11:25:14