Marshalling
# Marshalling

El Marshalling o Marshaling (presentación) es el proceso de transformación de la representación de datos a un formato adecuado, realizado según unas normas específicas y que su objetivo más primordial es la transferencia de estos a través de la red. El uso principal del marshalling lo veremos en sistemas distribuidos, ya que en este tipo de sistemas podemos encontrarnos distintos tipos de hardware, debido a los cuales podemos tener problemas en la interpretación de los datos recibidos al guardarlos en disco, lo que nos llevaría a un error. Este problema se debe a que las diferentes CPU's utilizan cada una sus propias reglas para el posicionamiento de los campos de las estructuras en memoria. El mecanismo que sigue el marshalling para que el envío se haga satisfactoriamente seria, primero tenemos la información en el formato de la plataforma utilizada por el emisor, convertimos estos datos a un formato estándar que usaremos para la transferencia, una vez transferidos el receptor tendrá que decodificar esos datos y crear un dato nuevo en su plataforma. Dentro del concepto marshalling, podemos definir 2 subprocesos, codificación y decodificación a los que nos podemos referir como marshalling y unmarshalling.

## Uso

El marshalling es utilizado principalmente en las llamadas a procedimientos remotos (RPC), en las que necesitaremos mecanismos para que la comunicación entre procesos sea exitosa. El marshalling está soportado por muchos lenguajes como son C, C++, Java, C#, PERL, Python, Scala entre otros muchos,que han ido incluyendo paquetes, módulos y API para dar este servicio a sus usuarios.

## Diferencias con serialización

En muchos lenguajes se usa el término de serialización como sinónimo de marshalling, ya que ambos procedimientos pudiera parecer que hacen lo mismo, ambos transforman datos a otro formato que los beneficie ya sea para el envío o para almacenarlos. Pero veremos que son mecanismos similares pero que tienen propósitos distintos.

En la serialización, copiamos los datos estructurados desde o hacia una primitiva en forma de flujo de bytes, sin tener en cuenta el tipo de datos. Esto nos puede venir bien cuando nos comunicamos dentro de un mismo entorno.

En cambio, el marshalling, está principalmente pensado para sistemas distribuidos y, por eso, debemos tener más información aparte de los datos propiamente dichos. Para poder interpretar los datos necesitaremos enviar junto a estos metadatos, los cuales serán los encargados de que los datos se muestren tal y como fueron enviados.

## Tipos de representación

Para poder realizar el marshalling con la información que queremos enviar, necesitamos un formato estándar y bien estructurado, al cual transformar nuestros datos para que después del envío, la transformación inversa sea satisfactoria y que se logre el envío de datos satisfactorio.

### CORBA

CORBA es un estándar definido por la OMG. Este método lo que hace es crear un objeto remoto propio de CORBA en representación del objeto local, de manera que la comunicación entre diferentes equipos sea satisfactoria.Esto podemos hacerlo entre diferentes máquinas, pero no todos los lenguajes están soportados por CORBA. Debido a fallos de implementación y problemas de diseño de CORBA se fue quedando en desuso.

### Serialización de Java

Aquí vemos como en Java se utiliza el término serialización de manera indiferente para ambos procesos. En este caso podremos realizar el marshalling entre diferentes equipos pero tenemos la desventaja de que sólo funciona dentro de java, no podremos tener comunicación entre lenguajes.

### XML

El XML, principal formato para el marshalling, esto se debe a que no hay incompatibilidades de comunicación entre lenguajes ni plataformas. De hecho es tan popular, que muchos lenguajes ya tienen APIs para facilitar este tipo de marshalling, por ejemplo tenemos JAXB en java o XmlSerializer para C#.

## Unmarshalling

Dentro del proceso de marshalling tenemos el subproceso del unmarshalling. Éste trata de la parte del receptor que reconstruye el elemento a través de la información recibida en un formato estándar. Este proceso puede ser algo más complicado que el de marshalling, ya que no es una traducción directa. Esto se debe a que no sólo enviamos un dato sino metadatos. Esta diferencia hace que el marshalling y unmarshalling no sean simétricos y que el unmarshalling tenga una carga de trabajo mayor.

