Pregunta

Si tiene una instancia de objeto A que hace referencia a otros objetos (por ejemplo, instancias B y C), y serializa binariamente A en un archivo, ¿qué sucede?¿Tiene ahora datos serializados que incluyen A, B y C?

¿Cómo funciona exactamente?¿Qué obtendré si deserializo los datos?A, B y C ??

(No dude en incluir explicaciones sobre el funcionamiento interno también).

¿Fue útil?

Solución

Todas las referencias a otros objetos también se serializarán. Si deserializa los datos, terminará con un conjunto completo y funcional de sus datos, incluidos los objetos A, B y C. Ese es probablemente el beneficio principal de la serialización binaria, en contraposición a la serialización XML.

Si alguna de las otras clases a las que su objeto tiene una referencia no está marcada con atributo [Serializable] , obtendrá un SerializationException en tiempo de ejecución (cuya imagen fue robada descaradamente de la web; los errores de tiempo de ejecución ni siquiera se ven así en las versiones actuales de VS):

Ejemplo de una SerializationException no controlada

Más allá de eso, no estoy muy seguro de qué "cosas internas" esperabas entender. La serialización utiliza reflejo para recorrer los campos públicos y privados de los objetos, convirtiendo a un flujo de bytes, que finalmente se escriben en un flujo de datos. Durante la deserialización, ocurre lo contrario: se lee un flujo de bytes del flujo de datos, que se utiliza para sintetizar una réplica exacta del objeto, junto con la información de tipo. Todos los campos del objeto tienen los mismos valores que tenían antes; no se llama al constructor cuando se deserializa un objeto. La forma más sencilla de pensar en ello es simplemente tomando una instantánea en el lugar del objeto, que puede restaurar a su estado original a voluntad.

La clase que es responsable de la serialización y deserialización real se llama formateador (siempre hereda de interfaz IFormatter ). Su trabajo es generar un "gráfico de objeto", que es un árbol generalizado que contiene el objeto que se serializa / deserializa como su raíz. Como se mencionó anteriormente, el formateador usa la reflexión para recorrer este gráfico de objeto, serializando / deserializando todas las referencias de objeto contenidas en ese objeto. El formateador también es lo suficientemente inteligente como para saber que no debe serializar ningún objeto en el gráfico más de una vez. Si dos referencias de objeto apuntan realmente al mismo objeto, esto se detectará y ese objeto solo se serializará una vez. Esta y otra lógica evita entrar en un bucle infinito.

Por supuesto, es fácil tener una buena comprensión general de cómo funciona este proceso. Es mucho más difícil escribir el código que lo implementa usted mismo. Afortunadamente, eso ya se ha hecho para ti. Parte del objetivo de .NET Framework es que toda esta complicada lógica de serialización está incorporada, lo que lo deja libre de preocuparse por ello. No pretendo entenderlo todo por mí mismo, y ciertamente tampoco es necesario que usted lo sepa para aprovechar al máximo la funcionalidad que ofrece. Los años de escribir todo ese código a mano finalmente terminaron. Debería regocijarse, en lugar de preocuparse por los detalles de implementación. :-)

Otros consejos

En primer lugar, el tipo de objeto A debe etiquetarse con el atributo [Serializable].Serializar A serializará todos sus datos de miembros, privados o públicos, siempre que los tipos de miembros también estén etiquetados con [Serializable] (o para usar su ejemplo, siempre que los tipos B y C estén marcados como [Serializable]).Los intentos de serializar datos, directa o indirectamente, de un tipo que no es [serializable] resultarán en una excepción.

Varios de los tipos .NET integrados ya están marcados como [Serializable], incluidos System.Int32 (int), System.Boolean (bool), etc.

Puede leer más sobre la serialización de .NET aquí: http:// msdn.microsoft.com/en-us/library/4abbf6k0.aspx .

Los objetos a los que hace referencia el objeto principal también deben ser [serializables].Siempre que todo lo haga automáticamente el formateador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top