2011-08-31 15 views
12

Encuentro que los atributos [DataContract] y [DataMember] son un poco desordenados y preferiría hacer esto con el código en un método de configuración o algo así. es posible?Establecer DataContract y DataMember sin todos los atributos

+4

¿Qué tiene de complicado una decoración inicial? –

+0

No estoy seguro de cómo responder. Simplemente desordenado. –

+3

Tengo muchas entidades y, en general, quiero extenderlas todas, incluidas todas las propiedades, por lo que resulta incómodo repetir un atributo cientos de veces. Espero descubrir el enfoque de "exclusión voluntaria" con el que Ladislov me está ayudando a continuación. Prefiero adornar a los miembros que no quiero incluir. –

Respuesta

14

No tiene que usar estos atributos en absoluto. DataContractSerializer serializará todas las propiedades públicas con getter y setter, pero en el caso de serializar entidades con propiedades de navegación, finalizará fácilmente con una excepción debido a la "referencia cíclica".

Para evitar esa excepción debe utilizar ya sea [DataContract(IsReference = true)] en su clase de entidad con DataMember en cada propiedad que desea serilize o IgnoreDataMember en cada propiedad que no desea serializar.

La última y más compleja opción es evitar los atributos por completo y las clases personalizadas que implementan IDataContractSurrogate para controlar la serialización fuera del tipo.

También puede escribir su proceso de serialización completamente personalizado o utilizar serialización XML o serialización binaria con todos sus requisitos.

+2

Pero agrego [DataContract] a mi clase y puedo devolverlo desde una operación WCF ... pero los contenidos están en blanco, entonces agrego [DataMember] a un par de propiedades y de repente esas (y solo aquellas) son devuelto en el resultado serializado. Entonces, ¿por qué no funciona el mío como dices donde de forma predeterminada se devuelven todas las propiedades? –

+0

Por cierto, son propiedades públicas con {get; establecer;} –

+5

Una vez que agrega el atributo 'DataContract' ** debe ** marcar las propiedades que desea serializar con el atributo' DataMember'. La serialización predeterminada que describí funciona solo si no usa el atributo 'DataContract'. –

1

No, el DataContractSerializer es un serializador opcional, debe indicarle lo que desea incluir.

Con otros serializadores necesita usar cosas como NonSerializedAttribute o XmlIgnoreAttribute para decirle al serializador que deje las cosas en paz.

Cuestiones relacionadas