Lección 9: Serialización de mensajes y optimización Flashcards
Serialización de mensajes
La serialización de mensajes se utiliza para convertir los datos de un objeto a un formato que se pueda almacenar o enviar y volver a recuperar después.
Objeto en lenguaje de programación.
Un objeto en un lenguaje de programación es una instancia de una clase con unos valores específicos.
El valor de los datos de un objeto es una estructura de datos almacenada en memoria.
Formatos de serialización
XML, JSON, CSV, Binario…
• Pero finalmente todos terminan convertidos a binario.
• Los medios de almacenamiento y red en última instancia
necesitan los datos en binario.
Serializando directamente en binario
• Es la opción mas rápida de todas y la que genera resultados mas pequeños (los objetos ocupan menos).
- Problemas:
• No está estandarizada, depende de la librería que utilicemos.
• No suele ser compatible entre lenguajes de programación.
• A la hora de leer si algo falla es complejo o imposible saber que ha pasado.
• No podemos ver o hacer “logging” del objeto salvo que tengamos el código de deserialización.
Serializando primero a texto
- Es la opción mas versátil y sencilla pero mucho mas lenta.
- Los formatos de texto como XML, Json o CSV son estándares.
- Existen estándares de conversión de texto a binario que entienden todos los lenguajes de programación (character encoding).
Formatos de serialización en texto.
- XML: más completo pero también más lento y pesado.
- JSON: gana velocidad respecto a XML y también reduce el tamaño.
- CSV: es el más rápido, pero solo soporta mensajes muy simples.
Serialización binaria: Librerías
- Existen múltiples librerías que intentan resolver el problema de serialización binaria, creando sus propios “estándares”.
- Algunas como Google Protocol Buffers requieren que especifiquemos como es el objeto y como serializar cada campo.
- Otras como Kryo leen las clases usando “reflection” y crean sus propios serializadores en tiempo real.
- No existe ningún estándar en la industria mas allá del uso de librerías.
Serialización binaria: Java
• Java incluye por defecto su propia versión de serialización binaria. • Funciona de forma similar a Kryo, no es necesario indicar los
campos a serializar.
• Lo único que necesitamos es que la clase implemente la interfaz
“Serializable”.
• Es relativamente lenta comparada con mecanismos como Kryo o Google Protocol Buffers.
Serialización binaria: ¿cómo funciona?
- El objetivo es convertir un objeto a una secuencia de bytes consecutivos y ser capaces de hacer el paso contrario.
- Debemos convertir cada tipo simple, cada String, cada sub- objeto, cada lista, cada array a una secuencia de bytes.
- Cada uno de estos tipos de convierte de forma distinta.
Convirtiendo un entero a binario
• Primero necesitamos un array de bytes para contener el resultado.
- Uso de operadores shifr y and binario:
• Shift permite ”desplazar” el valor binario a la derecha o a la izquierda. El operador suele ser “<>”
• And binario realiza un “and” bit a bit. El operador suele ser “&” (solo coge los elementos comunes a ambos sets)
Extracción del entero
- Primero usamos shift para colocar la parte que queremos al final.
- Después usamos and para extraer únicamente lo que nos interesa.
- Se pueden serializar en tamaño variable (más lento, pero ocupan menos)
Tamaño enteros
4 bytes (32 bits)
Tamaños en bytes de los distintos tipos.
- int -> 4 bytes
- long -> 8 bytes
- float -> 4 bytes
- double -> 8 bytes
- char -> 1 byte o 2 (4) bytes según el lenguaje
Char y String según el lenguaje
• Un string es un array de “chars”.
• Un char en C o C++ ocupa 1 byte y representa un carácter
ASCII.
• Únicamente puedo representar 256 caracteres distintos.
• En java un char ocupa 2 bytes, son caracteres unicode pensados para representar todo el rango de caracteres posible (árabe, chino, japonés, emoji, etc)
• En unicode puedo representar 65.535 valores distintos.
UTF-8
- Es uno de los tipos de codificación mas utilizados.
- La mayoría de los ficheros de texto están codificados en UTF-8.
- Los HTML o CSS de las peticiones web están codificados en UTF-8.
- UTF-8 soporta el rango de caracteres completo de Unicode.
- La ventaja es que no siempre utiliza 2 bytes para representar un carácter, depende del tipo de carácter.
ASCII
- Es un código de caracteres (método que permite convertir un carácter de un lenguaje natural en un símbolo de otro sistema de representación) basado en el alfabeto latino, tal como se usa en inglés moderno.
- Solo puede representar 128 caracteres (tamaño de 1 byte, 8 bits: solo se usan 7 de los bits, el octavo es el bit de paridad que sirve para comprobar errores).
Unicode
Unicode es un estándar de codificación de caracteres diseñado para facilitar el tratamiento informático, transmisión y visualización de textos de numerosos idiomas y disciplinas técnicas, además de textos clásicos de lenguas muertas.
- Cada caracter ocupa 2 bytes (tiene un montón de combinaciones posibles)
Optimización: La importancia del hardware
• Para optimizar código es fundamental conocer no solo el lenguaje si no también el hardware sobre el que se ejecuta.
• Uno de los puntos mas importantes es el acceso a datos. • Los procesadores utilizan “caches” para evitar tener que
acceder siempre a memoria.
Cache en CPUs modernas
- Cada ”core” tiene sus propios registros y cache L1 y L2
* Los cores comparten una cache común L3
Optimización
- Reutilizar objetos y arrays incrementa la posibilidad de que el dato se mantenga en cache, evitando accesos a memoria.
- Los tipos de datos que asignan memoria en bloque (por ejemplo arrays) son mas eficientes
Solución al problema de las colas: patrón disruptor
- Se suelen utilizar “colas” en mercados financieros para desacoplar productores y consumidores.
- Cada objeto estará en un lugar distinto en la memoria y casi siempre serán posiciones no consecutivas
- El patrón disruptor intenta resolver estos problemas, aprovechándose del funcionamiento del hardware y las caches.
- La cola se crea como un buffer circular de tamaño fijo donde todos sus elementos se inicializan a valores por defecto.
- Se crea toda la memoria necesaria desde el principio.
- Tenemos 1 puntero de escritura y varios de lectura.
- Los punteros de lectura no pueden superar al de escritura.
Los elementos de un complex type definidos en el XSD deben aparecer en su correspondiente XML en el mismo orden.
Seleccione una:
Verdadero
Falso
Falso
De las siguientes, ¿cuales son ventajas de serializar objetos en formatos basados en texto como XML o JSON frente a utilizar binario directamente?
Seleccione una o más de una:
a. Los formatos de texto como XML o JSON están estandarizados
b. La conversión de texto a binario sigue formatos estándares que entiende casi cualquier lenguaje de programación
c. Aunque la lectura falle, es posible “leer” los datos del objeto a simple vista para buscar el problema
d. Son mas rápidos que la serialización binaria
a. Los formatos de texto como XML o JSON están estandarizados
b. La conversión de texto a binario sigue formatos estándares que entiende casi cualquier lenguaje de programación
c. Aunque la lectura falle, es posible “leer” los datos del objeto a simple vista para buscar el problema
Cuando el procesador accede a memoria para obtener un dato, lo extrae y almacena directamente en sus registros internos.
Seleccione una:
Verdadero
Falso
Falso