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

125

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

Ma question est donc la suivante: y a-t-il un attribut ou quelque chose que je peux utiliser pour que DataContractSerializer ignore une propriété?

NotDan
la source

Réponses:

176

IgnoreDataMemberAttribute ?

Paul Ruane
la source
5
Ma couche de domaine n'avait pas la référence d'assemblage appropriée, puis j'ai mal lu la documentation et j'ai fini par penser que c'était une nouvelle fonctionnalité de .NET 4.5. J'ai essayé de retrouver ce fil pour supprimer mon commentaire sans succès (j'étais pressé). D'ailleurs, regarder la date de cette réponse aurait dû sonner une cloche .... 2009 .NET 4.5 post ...) Désolé de perdre votre temps.
Pluc
2
Sur .NET 4.5 ici: System.Runtime.Serialization.IgnoreDataMemberAttribute fonctionne pour n'importe
quoi
1
Même les bibliothèques tierces ont ajouté la prise en charge de [IgnoreDataMember], comme JSON.NET.
Doug
5
Un bref exemple ne ferait-il pas de cette réponse une réponse valant réellement les votes?
TaW
1
Cette réponse est incomplète et donc trompeuse. [IgnoreDataMember]ne fonctionnerait pas si la classe a un [Serializable]attribut. Voir les détails dans la réponse de Doug .
Alex Fainshtein le
165

En outre, 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 versions ultérieures, pour permettre la prise en charge de la sérialisation des types anonymes.

Donc, cela dépend de la façon dont vous avez décoré votre classe et de la façon d'empêcher un membre de sérialiser:

  • Si vous avez utilisé [DataContract], supprimez le [DataMember]pour la propriété.
  • Si vous avez utilisé [Serializable], ajoutez [NonSerialized]devant le champ de la propriété.
  • Si vous n'avez pas décoré votre classe, vous devez ajouter [IgnoreDataMember]à la propriété.
Doug
la source
1
que voulez-vous dire par "décoré votre classe" veuillez expliquer?
alamin
Si vous n'avez utilisé aucun attribut sur votre classe, comme [DataContract] ou [Serializable], vous ajouteriez [IgnoreDataMember] à la propriété que vous ne souhaitez pas sérialiser. Voir la réponse de Paul ou checkoutall.com/Blog/Index/201410240204236271/…
Doug
8
C'est beaucoup plus informatif que la réponse acceptée.
pvgoran
Existe-t-il un moyen d'ignorer ce membre et de continuer à sérialiser la structure / classe de données?
ryanwebjackson
Que diriez-vous d'exclure une PROPRIÉTÉ lorsque [Serializable] a été utilisé?
Daniel
31

Dans 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 à quiconque a trouvé cette question en essayant de savoir comment ignorer une propriété lors de la sérialisation en XML, comme je l'étais).

Kris Adams
la source
4
Ah vote négatif. Je pensais juste que je publierais cela 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 trouvait ce message de la même manière que moi.
Kris Adams
[en méta] Je pense qu'ils ont voté négatif 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 leur recherche
SparK
8
Cette réponse est exactement ce que je cherchais
aclave1
0

Ce que vous dites est en conflit avec ce qu'il dit dans la bibliothèque MSDN à cet emplacement:

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

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

Tony le lion
la source
1
Vous pouvez trouver le document ici (3ème paragraphe, 2ème phrase): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan
Vous avez raison sur le lien que vous avez publié, je ne sais pas pourquoi ils ne le mentionnent pas là aussi.
NotDan