2010-10-21 22 views
6

¿De dónde viene exactamente la serialización en la imagen? He leído sobre serializtion en la 'red y he llegado a saber que¿de qué se trata la serialización?

es una interfaz que si implementa en una clase, significa que puede ser automáticamente serializar y deserializar por los diferentes serializadores.

Dame una buena razón por qué y cuándo una clase necesita ser serializada? Supongamos que una vez que se serializa, ¿qué sucede exactamente?

Respuesta

25

La serialización es necesaria siempre que un objeto deba ser persistido o transmitido más allá del alcance de su existencia.

Persistencia es la capacidad de guardar un objeto en algún lugar y cargarlo más tarde con el mismo estado. Por ejemplo:

  • Es posible que necesite almacenar una instancia de objeto en el disco como parte de un archivo.
  • Es posible que necesite almacenar un objeto en una base de datos como un blob (objeto grande binario).

La transmisión es la capacidad de enviar un objeto fuera de su alcance original a algún receptor. Por ejemplo:

  • Es posible que deba transmitir una instancia de un objeto a una máquina remota.
  • Es posible que necesite transmitir una instancia a otro AppDomain o proceso en la misma máquina.

Para cada una de estas, debe haber alguna representación de bits en serie que pueda almacenarse, comunicarse y luego utilizarse para reconstituir el objeto original. El proceso de convertir un objeto en esta serie de bits se denomina "serialización", mientras que el proceso de convertir la serie de bits en el objeto original se denomina "deserialización".

La representación real del objeto en forma serializada puede variar según cuáles sean sus objetivos. Por ejemplo, en C#, tiene serialización XML (a través de la clase XmlSerializer) y serialización binaria (mediante el uso de la clase BinaryFormatter). Dependiendo de sus necesidades, incluso puede escribir su propio serializador personalizado para realizar trabajos adicionales, como compresión o encriptación. Si necesita un formato de serialización neutral en el idioma y la plataforma, puede probar el Protocol Buffers de Google que ahora tiene support for .NET (no lo he usado).

La representación XML mencionada anteriormente es buena para almacenar un objeto en un formato estándar, pero puede ser detallado y lento dependiendo de sus necesidades. La representación binaria ahorra espacio, pero no es tan portátil en todos los idiomas y tiempos de ejecución como lo es XML. El punto importante es que el serializador y el deserializador deben entenderse entre sí. Esto puede ser un problema cuando comienzas a introducir versiones de compatibilidad y versiones anteriores y posteriores.

Un ejemplo de posibles problemas de compatibilidad de serialización:

  • Usted lanzamiento de la versión 1.0 de su programa que es capaz de serializar algunos Foo objeto a un archivo.
  • El usuario realiza alguna acción para guardar su Foo en un archivo.
  • Lanza la versión 2.0 de su programa con un Foo actualizado.
  • El usuario intenta abrir el archivo de la versión 1.0 con su programa de la versión 2.0.

Esto puede ser problemático si la versión 2.0 Foo tiene propiedades adicionales que la versión 1.0 Foo no lo hizo. Tienes que explícitamente no admitir este escenario o tener alguna versión de versiones con tu serialización. .NET puede hacer algo de esto por ti. En este caso, también podría tener el problema inverso: el usuario podría intentar abrir un archivo de la versión 2.0 Foo con la versión 1.0 de su programa.

No he utilizado estas técnicas mí mismo, pero .NET 2.0 y posterior tiene soporte para version tolerant serialization para apoyar tanto compatibilidad hacia adelante y hacia atrás:

  • Tolerancia de datos extraños o inesperados. Esto permite versiones más nuevas del tipo para enviar datos a versiones anteriores.
  • Tolerancia a la falta de datos opcionales. Esto permite que las versiones anteriores envíen datos a versiones más recientes.
  • Delay de serialización. Esto habilita la configuración inteligente del valor predeterminado en los casos en que faltan datos.
+0

¿me puede dar un escenario o ejemplo, donde el objeto necesita persistir más allá del alcance de su existencia? – FosterZ

+0

oh bien, gracias – FosterZ

+0

gracias por la información del complemento 'Google Buffer de protocolo' y' serialización tolerante a la versión'. – FosterZ

1

no clases, pero los objetos específicos podrían ser serializados para almacenar de alguna almacenamiento permanente o para pasar el objeto a otra aplicación/a través de la red.

2

Por ejemplo, cuando desea enviar objetos a través de la red o almacenarlos en archivos.

Digamos que está creando un formato de juego de video para guardar. Entonces podría hacer que la clase Player y cada Enemy serializables. De esta forma, sería fácil guardar el estado de los objetos actuales en un archivo.

En el otro extremo, al escribir una implementación multijugador para su juego, puede enviar el Player serializado a través de la red a los otros clientes, que luego podrían manejar estos datos.

+0

su ejemplo es bueno ... Thnx – FosterZ

1

por ejemplo, cuando desea enviar un objeto a alguna url, puede decidir enviarlo en formato xml. El proceso de conversión desde el objeto en memoria a (en este caso) xml se llama serialización. La conversión de xml a una memoria se llama deserialización.

2

En los lenguajes no orientados a objetos, normalmente uno tendría datos almacenados en la memoria en un patrón de bytes que 'tendría sentido' sin referencia a nada más. Por ejemplo, un grupo de formas en un editor de gráficos podría simplemente tener todos sus puntos almacenados consecutivamente. En dicho programa, simplemente almacenar el contenido de todas las matrices en el disco podría generar un archivo que, cuando se vuelva a leer en esas matrices, arrojaría los datos originales.

En los lenguajes orientados a objetos, muchos objetos se almacenan como referencias a otros objetos. Simplemente almacenar los contenidos de las estructuras de datos en memoria no será útil, porque una referencia al objeto n. ° 24601 no dirá nada sobre lo que ese objeto representa. Mientras que un sistema orientado a objetos puede ser capaz de hacer un buen trabajo averiguando qué significan los datos en memoria y tratar de convertirlo automáticamente a un formato sensible, no puede reconocer todas las distinciones entre las referencias de objetos que apuntan al mismo objeto, y aquellos que apuntan a objetos que coinciden.Por lo tanto, a menudo es necesario ayudar al sistema al convertir objetos a una secuencia de bits sin formato.

Cuestiones relacionadas