Blog Jose Cullar

//Scrum Master, Tech Lead & Full Stack Developer

Serialización y deserialización de objetos mediante XMLSerializer, SOAPFormatter y BinaryFormatter.

por Jose el 27 abril, 2010

La serialización (o marshalling) consiste en codificar el estado/información de un objeto o una colección a un formato de cadena de texto. Dicha cadena de texto podemos almacenarla (en memoria o en disco) y/o enviarla a una aplicación remota (mediante Webservice, .NET Remoting, etc.). Si necesitáramos recuperar la cadena de texto para recuperar el estado/información del objeto (proceso inverso), utilizaríamos la deserialización.

Serialización/deserialización de objetos

Las principales ventajas que nos aporta la serialización y deserialización:

  • Escalabilidad en la aplicación. Sea cual sea la arquitectura física o lógica.
  • Almacenar o enviar el estado de los objetos a cualquier plataforma/lenguaje compatible. Normalmente XML.
  • Utilización de protocolos simples para su envío o almacenamiento.
  • Interoperabilidad entre aplicaciones capas y/o servidores.

Tipos de serialización/deserialización mediante .NET Framework:

  • Binaria mediante BinaryFormatter. Codificación binaria a fin de generar una serialización compacta. Proporciona mejor rendimiento. Se serializan todos los miembros, incluso aquellos que son de sólo lectura. Generalmente utilizado para la comunicación mediante sockets.
  • XML mediante XMLSerializer. La serialización XML proporciona código más legible, así como mayor flexibilidad y compatibilidad para compartir objetos y utilizarlos para fines de interoperabilidad.
  • XML SOAP (Simple Object Access Protocol) mediante SoapFormatter. Comúnmente utilizado en RPC.

Serialización/deserialización de objetos

          Si la interoperabilidad y la compatibilidad entre plataformas (lenguajes/servidores) no es una prioridad, recomiendo la serialización y deserialización mediante BinaryFormatter. Ya que:

  • Ofrece mejor rendimiento.
  • Altamente compatible con serialización/deserialización de objetos que implementan IDictionary y colecciones genéricas de objetos complejos (con XMLSerializer te encontrarás bastantes problemas de incompatibilidad).
  • La codificación de la cadena de texto serializada usa tamaños mínimos.

Recuerda que:

  • Puedes configurar/personalizar la forma en la que se serializa/deserializa implementando la interfaz de .NET Framwork ISerializable.
  • Requisitos mínimos para que una clase pueda ser serializada:

    • Constructor sin parámetros.
    • Especificar atributo de clase [Serializable()]

Sigue estos enlaces para ver código de ejemplo y ampliar ésta información:

2 thoughts on “Serialización y deserialización de objetos mediante XMLSerializer, SOAPFormatter y BinaryFormatter.

  1. Lamentablemente .NET no serializa objetos que tengan referencias cruzadas o circulares, se debe agregar “Ingore” en tales casos, no me ha sido muy util dada la complejidad que tienen los objetos con los que trabajo, obligandome a repensar sobre el codigo que estoy utilizando.

  2. Hola Daniel. Gracias por tu aportación.

    Si los objetos hacen referencia a ellos mismos, incluso a través de otros objetos, la serialización mediante resultados de replicación resulta en un bucle infinito. (Si esto sucede, el serializador inicia una SerializationException.).

    Es absolutamente normal. Tal y como comentas tu única solución es indicar “Ignore” para evitar dicha excepción.

    A la hora de diseñar una correcta arquitectura que nos permita realizar desarrollos eficientes, rápidos y sencillos, debemos tener muy en cuenta el principio KISS (http://www.josecuellar.net/arquitectura-de-software/principios-a-seguir-en-el-diseno-de-un-sistema/). Esto evita que tengas que “repensar” innumerables contratiempos que puedan surgirte a consecuencia de código/diseño complejo.

    El compilador de .NET te avisa con Warnings de las referencias circulares para prevenirlas.

    Desde mi criterio: El problema no es que .NET no te permita serializar referncias circulares. Sinó que el código que tienes necesita urgentemente un refactoring (http://www.josecuellar.net/js-ajax/cuando-y-porque-realizar-tareas-de-refactoring/).

    Si no pudieras refactorizar, intenta orientar la solución a alternativas que reduzcan la complejidad y eviten las referencias circulares, en cada caso.

    Un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *