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.
gracias por la explicación detallada. – fizmhd