¿Cómo puedo ignorar una propiedad al serializar usando DataContractSerializer?

125

Estoy usando .NET 3.5SP1 y DataContractSerializer para serializar una clase. En SP1, cambiaron el comportamiento para que no tenga que incluir los atributos DataContract / DataMember en la clase y solo serializará todo. Este es el comportamiento que estoy usando, pero ahora necesito ignorar una propiedad del serializador. Sé que una forma de hacer esto es agregar el atributo DataContract a la clase y simplemente colocar el atributo DataMember en todos los miembros que quiero incluir. Sin embargo, tengo razones para que esto no funcione para mí.

Entonces mi pregunta es, ¿hay algún atributo o algo que pueda usar para hacer que DataContractSerializer ignore una propiedad?

NotDan
fuente

Respuestas:

176

IgnoreDataMemberAttribute ?

Paul Ruane
fuente
55
Mi capa de dominio no tenía la referencia de ensamblaje adecuada, luego no leí la documentación y terminé pensando que era una nueva característica de .NET 4.5. Intenté encontrar este hilo para eliminar mi comentario sin éxito (tenía prisa). Además, mirar la fecha de esta respuesta debería haber sonado una campana .... 2009 .NET 4.5 post ...) Perdón por perder el tiempo.
Pluc
2
En .NET 4.5 aquí: System.Runtime.Serialization.IgnoreDataMemberAttribute funciona para cualquier cosa
SparK
1
Incluso las bibliotecas de terceros han agregado soporte para [IgnoreDataMember], como JSON.NET.
Doug
55
¿No haría un breve ejemplo que esta sea una respuesta que realmente valga la pena?
TaW
1
Esta respuesta es incompleta y, por lo tanto, engañosa. [IgnoreDataMember]no funcionaría si la clase tiene [Serializable]atributo. Ver detalles en la respuesta de Doug .
Alex Fainshtein
165

Además, DataContractSerializer serializará elementos marcados como [Serializable] y también serializará tipos no marcados en .NET 3.5 SP1 y posterior, para permitir el soporte para serializar tipos anónimos.

Entonces, depende de cómo hayas decorado tu clase en cuanto a cómo evitar que un miembro serialice:

  • Si lo usó [DataContract], elimine el [DataMember]de la propiedad.
  • Si lo usó [Serializable], agregue [NonSerialized]delante del campo para la propiedad.
  • Si no ha decorado su clase, entonces debe agregar [IgnoreDataMember]a la propiedad.
Doug
fuente
1
¿Qué quisiste decir con "decoraste tu clase"?
alamin
Si no ha utilizado ningún atributo en su clase, como [DataContract] o [Serializable], entonces agregaría [IgnoreDataMember] a la propiedad que no desea serializar. Vea la respuesta de Paul o checkoutall.com/Blog/Index/201410240204236271/…
Doug
8
Esto es mucho más informativo que la respuesta aceptada.
pvgoran
¿Hay alguna forma de ignorar a ese miembro y continuar serializando la estructura / clase de datos?
ryanwebjackson
¿Qué tal excluir una PROPIEDAD cuando se usó [Serializable]?
Daniel
31

En la serialización XML, puede usar el atributo [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) para ignorar una propiedad al serializar una clase.

Esto puede ser útil para usted (o simplemente puede ser útil para cualquiera que haya encontrado esta pregunta al intentar descubrir cómo ignorar una propiedad al serializar en XML, como lo hice yo).

Kris Adams
fuente
44
Ah voto negativo. Solo pensé en publicar eso porque cuando busqué cómo ignorar una propiedad al serializar una clase, apareció esta publicación. Y quería ponerlo aquí si alguien encuentra esta publicación de la misma manera que yo.
Kris Adams
[en meta] Creo que votaron negativamente porque deberías abrir otra pregunta (más específica) sobre XMLSerialization y responderla, para que la gente encuentre esa pregunta más relevante en su búsqueda
SparK
8
Esta respuesta es exactamente lo que estaba buscando
aclave1
0

Lo que está diciendo está en conflicto con lo que dice en la biblioteca de MSDN en esta ubicación:

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

No veo ninguna mención de la función SP1 que mencionas.

Tony el león
fuente
1
Puede encontrar el documento aquí (3er párrafo, 2da oración): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan el
Sin embargo, tienes razón sobre el enlace que publicaste, no estoy seguro de por qué no lo mencionan allí también.
NoDan