Como posso ignorar uma propriedade ao serializar usando o DataContractSerializer?

125

Estou usando o .NET 3.5SP1 e DataContractSerializer para serializar uma classe. No SP1, eles mudaram o comportamento para que você não precise incluir atributos DataContract / DataMember na classe e isso apenas serializará a coisa toda. Esse é o comportamento que estou usando, mas agora preciso ignorar uma propriedade do serializador. Eu sei que uma maneira de fazer isso é adicionar o atributo DataContract à classe e apenas colocar o atributo DataMember em todos os membros que eu quero incluir. Tenho razões, porém, para que isso não funcione para mim.

Portanto, minha pergunta é: existe um atributo ou algo que eu possa usar para fazer o DataContractSerializer ignorar uma propriedade?

NotDan
fonte

Respostas:

176

IgnoreDataMemberAttribute ?

Paul Ruane
fonte
5
Minha camada de domínio não tinha a referência de montagem adequada, então li a documentação e acabei pensando que era um novo recurso do .NET 4.5. Tentei encontrar de volta esta discussão para excluir o meu comentário sem sucesso (estava com pressa). Além disso, olhar para a data desta resposta deveria ter tocado um sino .... 2009 .NET 4.5 post ...) Desculpe por desperdiçar seu tempo.
Pluc
2
No .NET 4.5 aqui: System.Runtime.Serialization.IgnoreDataMemberAttribute funciona para qualquer coisa
SparK
1
Até bibliotecas de terceiros adicionaram suporte para [IgnoreDataMember], como JSON.NET.
Doug
5
Um pequeno exemplo não tornaria essa resposta realmente digna dos votos?
TAW
1
Esta resposta é incompleta e, portanto, enganosa. [IgnoreDataMember]não funcionaria se a classe tivesse [Serializable]atributo Veja detalhes na resposta de Doug .
Alex Fainshtein 21/06
165

Além disso, o DataContractSerializer serializa itens marcados como [Serializable] e também serializa tipos não marcados no .NET 3.5 SP1 e posterior, para permitir suporte para serialização de tipos anônimos.

Portanto, depende de como você decorou sua classe e como impedir que um membro serialize:

  • Se você usou [DataContract], remova o [DataMember]da propriedade.
  • Se você usou [Serializable], adicione [NonSerialized]na frente do campo a propriedade.
  • Se você não decorou sua turma, adicione- [IgnoreDataMember]a à propriedade.
Doug
fonte
1
o que você quis dizer com "decorou sua classe", por favor, explique?
alamin
Se você não usou nenhum atributo em sua classe, como [DataContract] ou [Serializable], adicione [IgnoreDataMember] à propriedade que não deseja serializar. Veja a resposta de Paulo ou checkoutall.com/Blog/Index/201410240204236271/…
Doug
8
Isso é muito mais informativo do que a resposta aceita.
precisa saber é
Existe alguma maneira de ignorar esse membro e continuar serializando a estrutura / classe de dados?
Ryanwebjackson #
Que tal excluir uma propriedade quando [Serializable] foi usado?
Daniel
31

Na serialização XML, você pode usar o atributo [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) para ignorar uma propriedade ao serializar uma classe.

Isso pode ser útil para você (ou pode ser útil para quem encontrou essa pergunta ao tentar descobrir como ignorar uma propriedade ao serializar em XML, como eu era).

Kris Adams
fonte
4
Ah voto negativo. Apenas pensei em postar isso porque, quando eu pesquisava como ignorar uma propriedade ao serializar uma classe, essa postagem surgiu. E eu queria colocá-lo aqui se alguém encontrasse este post da mesma maneira que eu.
Kris Adams #
[na meta] Eu acho que eles votaram negativo, porque você deve abrir outra (mais especifico) pergunta sobre XmlSerialization e respondê-la, para que as pessoas iria encontrar essa pergunta mais relevante em sua busca
faísca
8
Esta resposta é exatamente o que eu estava procurando
aclave1
0

O que você está dizendo está em conflito com o que diz na biblioteca do MSDN neste local:

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

Não vejo nenhuma menção ao recurso SP1 que você mencionou.

Tony o leão
fonte
1
Você pode encontrar o doc aqui (3º parágrafo, frase 2): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan
Você está certo sobre o link que postou, no entanto, não sei por que eles não o mencionam também.
24411 NotDan