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.
¿Son los campos en sí o el valor asignado a eso? –
¿Es el campo o el valor asignado a eso o a ambos? –
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 –