2009-05-30 12 views
6

En la serialización (serialización binaria) ¿qué datos se están transfiriendo? Una instancia de una clase (objeto) o valores asignados a las propiedades de ese objeto.¿Qué datos se pasan en la serialización? (Serialización binaria)

Quiero saber básicamente qué sucede en el proceso de serialización? Me refiero a que un objeto se convierte a su archivo de destino o lo que sea en serialización. ¿Pero cómo? ¿Qué pasos se siguen en este proceso?

¿Alguien puede ayudar?

Jay ...

Respuesta

1

De manera predeterminada, sólo los campos de un tipo son serializados al utilizar la serialización binaria. Las propiedades se tratan como métodos y no tienen ningún efecto en la serialización.

Al usar la serialización Xml, las propiedades públicas se serializan de forma predeterminada.

+0

¿Son los campos en sí o el valor asignado a eso? –

+0

¿Es el campo o el valor asignado a eso o a ambos? –

+0

Para la serialización xml, campos públicos + propiedades con un accesoador de lectura * y *; que no están marcados [XmlIgnore]; o 'IXmlSerializable' tiene primeros dibs ;-p –

4

Supongo que quiere decir BinaryFormatter; depende ;-p

El propósito de la serialización es expresar un objeto en memoria complejo como una secuencia simple de bytes (o dependiendo del serializador - caracteres, etc.) que pueden rehidratarse en el otro extremo para recrear el objeto.

Algunos tipos (primitivas, cadenas, etc.) tienen soporte directo incorporado por el serializador; los escribe directamente.

En el caso de las clases, el tipo de metadatos (incuding nombre de ensamblado, etc.) se escribe, entonces todos los campos del tipo se enumeran (en esencia, Type.GetFields(), incluyendo privado etc.). Para cada campo (no marcado [NonSerialized]), el nombre del campo se escribe y el valor se serializa (a través del mismo proceso). Eventualmente, todo se reduce a las primitivas incorporadas, algunas definiciones de tipo y algunos pares de nombre/valor de campo.

Una excepción aquí es si el tipo implementa ISerializable - en cuyo caso se solicita que el tipo se serialice a la salida. Esto es común en cosas como los tipos de diccionario, donde el diseño en memoria del tipo se puede expresar de manera diferente a una secuencia.

Durante la deserialización, el proceso se invierte; los metadatos de tipo se usan para crear un objeto vacío (a menos que tenga un constructor de serialización especial/ISerializable); luego los campos se establecen tal como se encuentran en la secuencia.

Tanto en la serialización como en la deserialización, hay puntos de "devolución de llamada" en los que puede ejecutar código adicional para reparar objetos para (de) serialización.

Este proceso es frágil; por muchas razones, see here, pero también es intolerante a la versión y específico de la implementación (no se puede consumir desde Java, etc.).

protobuf-net resuelve muchos de estos problemas, por ser un serializador binario que se basa contrato-, en lugar de campo de base.


+1

¿Qué pasa con las propiedades automáticas? ¿Están serializados sus campos de respaldo? Ah, y como mencionaste en protobuf-net, aquí está el enlace: http://code.google.com/p/protobuf-net/ – M4N

+1

re propiedades automáticas: sí, lo son; pero eso es * especialmente * frágil, ver el enlace "ver aquí" para saber por qué. Voy a editar para poner el enlace de protobuf-net, pero, curiosamente, ya lo sé bastante bien ;-p –

+0

Gracias. Por cierto: sabía que TU conocías el enlace, lo agregué a otros lectores :) – M4N

5

La serialización binaria consiste en tomar una instantánea del objeto y serializarlo. Esto significa que todos los campos privados, que no están marcados como NonSerializable, se serializarán con sus valores. Todos los objetos utilizados en la jerarquía de objetos se deben marcar como Serializable. Usted debe poner [field: NonSerializable] atributo en eventos, por lo que los controladores de eventos no quedar demasiado serializado: http://bytes.com/groups/net-c/250944-nonserialized-attribute-events#post1013968

Tenga en cuenta que al deserializar objetos, usted tiene que tener exactamente el mismo objeto en mismo conjunto que cuando se lo serializó (lo mismo significa la misma información de ensamblaje). De lo contrario, puede usar la clase SerializationBinder para que pueda restablecer el tipo en que se esterilizará la transmisión.

+1

¡Sí! Este atributo [field: NonSerializable] es muy bueno de saber. El código solo le proporciona una excepción de serialización espuria cuando no utiliza el atributo en los eventos, dejándolo completamente a oscuras sobre por qué se lanzó la excepción. – Dabblernl

+0

Pedant: [campo: NonSerializable] solo se aplica a "eventos de tipo campo"; para otras implementaciones de eventos (campo explícito, EventHandlerList, etc.) marcaría el campo directamente. –

+0

typo: sterlized? –

Cuestiones relacionadas