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).