entity-framework - leer - que es serializar y deserializar json
DataContractSerializer: cómo serializar clases/miembros sin atributos DataContract/DataMember (3)
DataContractSerializer
requiere que las clases y los miembros se DataMember
atributos DataContract
y DataMember
. Sin embargo, en mi caso, las clases se generan automáticamente con el marco EFPocoAdapater y estos atributos no están presentes.
¿Cómo puedo forzar la serialización de todos los miembros que usan DataContractSerializer sin que estos atributos estén presentes?
De Alexdej:
Esto cambió en 3.5SP1, espero que lo hayas visto: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx
Creo que es posible. Si implementa la interfaz ISerializable, el serializador utiliza su implementación en lugar de los atributos. Aunque creo que todavía tendrá que marcar la clase [Serializable].
Es un poco más trabajo que agregar atributos, pero funciona.
No puedes, claro y simple. El atributo es necesario para que DataContractSerializer recoja los elementos a serializar. En contrato con el XmlSerializer, que básicamente solo serializa todo (a menos que explícitamente le diga que lo ignore), DataContractSerializer es "opt-in" - debe decirle explícitamente (por medio de los atributos) qué campos y / o propiedades serializar
ACTUALIZACIÓN: Como varias personas han señalado, con .NET 3.5 SP1, Microsoft aflojó un poco esas reglas: cualquier propiedad pública de lectura / escritura será serializada automáticamente por DataContractSerializer. Al mismo tiempo, tu clase también necesita tener un constructor predeterminado sin parámetros: suena como los requisitos exactos que teníamos para XmlSerializer cuando ...
Por supuesto, esto:
- no le permite serializar algo privado; si desea serializarlo, debe exponerlo como propiedad pública de lectura / escritura
- no le permite especificar un orden elegido definido de los parámetros; solo los usará en el orden en que aparecen en la clase
- ahora requiere que tenga un constructor sin parámetros en su clase de nuevo para la deserialización
Sigo pensando que estas cosas deberían ser explícitas y claras, haciendo que las que ya no se necesiten abran el camino para la programación floja / descuidada. No me gusta. Pero si lo desea, puede usarlo ahora sin marcar explícitamente sus propiedades con [DataMember] .....
Bagazo
Simplemente marque la clase con el atributo [Serializable]. Cualquier miembro que no desee marca serializada con [NonSerialized]. Tenga en cuenta que [Serializable] hace que todos los campos se serialicen de manera predeterminada, donde [DataContract] serializó por defecto campos, excepto los marcados con [DataMember].