136 votes

Comment puis-je ignorer une propriété lors de la sérialisation à l'aide du DataContractSerializer?

Je suis en train d'utiliser .NET 3.5SP1 et DataContractSerializer pour sérialiser une classe. Dans SP1, ils ont changé le comportement de sorte que vous n'avez pas à inclure les attributs DataContract/DataMember sur la classe et il va simplement sérialiser le tout. C'est le comportement que j'utilise, mais maintenant j'ai besoin d'ignorer une propriété du sérialiseur. Je sais qu'une façon de le faire est d'ajouter l'attribut DataContract à la classe, et simplement ajouter l'attribut DataMember sur tous les membres que je veux inclure. J'ai cependant des raisons pour lesquelles cela ne fonctionnera pas pour moi.

Donc ma question est, y a-t-il un attribut ou quelque chose que je peux utiliser pour faire en sorte que le DataContractSerializer ignore une propriété?

189voto

Doug Points 2514

De plus, DataContractSerializer sérialisera les éléments marqués comme [Serializable] et sérialisera également les types non marqués dans .NET 3.5 SP1 et plus tard, pour permettre la prise en charge de la sérialisation des types anonymes.

Donc, tout dépend de la façon dont vous avez décoré votre classe pour éviter la sérialisation d'un membre :

  • Si vous avez utilisé [DataContract], alors supprimez [DataMember] pour la propriété.
  • Si vous avez utilisé [Serializable], alors ajoutez [NonSerialized] devant le champ de la propriété.
  • Si vous n'avez pas décoré votre classe, alors vous devriez ajouter [IgnoreDataMember] à la propriété.

2 votes

Que vouliez-vous dire par "décoré votre classe" s'il vous plaît expliquer ?

0 votes

Si vous n'avez pas utilisé d'attributs sur votre classe, comme [DataContract] ou [Serializable], alors vous ajouteriez [IgnoreDataMember] à la propriété que vous ne voulez pas sérialiser. Consultez la réponse de Paul ou checkoutall.com/Blog/Index/201410240204236271/…

9 votes

Ceci est beaucoup plus informatif que la réponse acceptée.

184voto

Paul Ruane Points 12840

Vous pourriez être à la recherche de IgnoreDataMemberAttribute.

5 votes

Ma couche de domaine n'avait pas la référence d'assembly appropriée, puis j'ai mal lu la documentation et j'ai fini par penser qu'il s'agissait d'une nouvelle fonctionnalité de .NET 4.5. J'ai essayé de retrouver ce fil de discussion pour supprimer mon commentaire sans succès (j'étais pressé). En outre, en regardant la date de cette réponse, j'aurais dû me douter....(2009 post de .NET 4.5...) Désolé d'avoir gaspillé votre temps.

2 votes

Sur .NET 4.5, ici : System.Runtime.Serialization.IgnoreDataMemberAttribute fonctionne pour n'importe quoi

1 votes

Même les bibliothèques tierces ont ajouté le support pour [IgnoreDataMember], comme JSON.NET.

36voto

Kris Adams Points 59

Lors de la sérialisation XML, vous pouvez utiliser l'attribut [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) pour ignorer une propriété lors de la sérialisation d'une classe.

Cela peut vous être utile (ou cela peut simplement être utile à toute personne qui a trouvé cette question en essayant de découvrir comment ignorer une propriété lors de la sérialisation en XML, comme moi).

4 votes

Ah vote négatif. Je voulais juste poster ça parce que lorsque j'ai cherché comment ignorer une propriété lors de la sérialisation d'une classe, ce message est apparu. Et je voulais le mettre ici si quelqu'un a trouvé ce message de la même manière que moi.

0 votes

[in méta] Je pense qu'ils ont voté négativement parce que vous devriez ouvrir une autre question (plus spécifique) sur XMLSerialization et y répondre, afin que les gens trouvent cette question plus pertinente dans leurs recherches

10 votes

Cette réponse est exactement ce que je cherchais

3voto

Cris Valenzuela Points 168

Essayez de marquer le champ avec l'attribut [NonSerialized ()]. Cela indiquera au sérialiseur d'ignorer le champ.

https://msdn.microsoft.com/fr-fr/library/system.nonserializedattribute(v=vs.110).aspx

1 votes

Pas lors de l'utilisation de DataContractSerializer

3 votes

Il a demandé au sujet des propriétés et non des champs !

0voto

Tony The Lion Points 28208

Ce que vous dites est en conflit avec ce qui est dit dans la bibliothèque MSDN à cet endroit :

http://msdn.microsoft.com/fr-fr/library/system.runtime.serialization.datacontractserializer.aspx

Je ne vois aucune mention de la fonctionnalité SP1 que vous mentionnez.

1 votes

Vous pouvez trouver le document ici (3ème paragraphe, 2ème phrase) : msdn.microsoft.com/en-us/library/ms733127.aspx

0 votes

Vous avez raison concernant le lien que vous avez posté, cependant, je ne suis pas sûr pourquoi ils ne le mentionnent pas là-bas aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X