2010-11-22 20 views
11

Estoy leyendo un código en mi nuevo proyecto y descubrí que el ex-desarrollador estaba usando Serializable y DataContract juntos.Serializable y DataContract (¿no frente?)

[Serializable] 

y

[DataContract(Namespace="Some.Name.Space", IsReference = true)] 

Asumo WCF ignorará Serializable cuando hay un atributo DataContract. ¿Es esta una suposición correcta? Si no, ¿cuáles son los beneficios de usar ambos al mismo tiempo?

Respuesta

15

Sí, [Serializable] se ignora si [DataContract] está presente. Esto puede ser útil, por ej. cree un tipo que tendrá una proyección de serialización para WCF, y otra proyección para .NET Remoting (si se usa junto con WCF por razones heredadas).

ACTUALIZACIÓN: Me acabo de encontrar con una situación en mi propio código donde tanto [DataContract] y [Serializable] eran necesarias. Supongamos que tiene una clase con un montón de propiedades generadas automáticamente (por ejemplo, public int Foo {get; set;}) que desea usar en ASP.NET ViewState y en un punto final JSON de ASP.NET Web API (que usa el serializador JSON de Newtonsoft o el DataContractSerializer). Para que ViewState funcione, necesita que la clase sea [Serializable]. Sin embargo, esto interrumpe la serialización de JSON, causando JSON como {"_k_BackingField123":456} en lugar de {"Foo":456}, porque en el modelo [Serializable] los campos de respaldo de la propiedad generados automáticamente se serializan en lugar de las propiedades mismas. Sin embargo, si también agrega [DataContract] al tipo (y [DataMember] a sus propiedades), los escenarios ViewState y JSON funcionan perfectamente.

+0

gracias por la explicación detallada. – fizmhd

Cuestiones relacionadas