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.
¿me puede dar un escenario o ejemplo, donde el objeto necesita persistir más allá del alcance de su existencia? – FosterZ
oh bien, gracias – FosterZ
gracias por la información del complemento 'Google Buffer de protocolo' y' serialización tolerante a la versión'. – FosterZ