¡Hola! Hablemos de la serialización. Probablemente recuerde que ya hemos tenido lecciones sobre serialización. Y así lo hicimos :) Aquí está el primero Y aquí está el segundo. Si no recuerda bien cómo funciona la serialización, por qué es necesaria la serialización y qué herramientas tiene Java para la serialización, puede seguir estas lecciones. La lección de hoy será sobre teoría. Vamos a echar un vistazo más de cerca a los formatos de serialización. Primero, recordemos qué es la serialización. La serialización es el proceso de almacenar el estado de un objeto en una secuencia de bytes. La deserialización es el proceso de restauración de un objeto a partir de estos bytes. Un objeto Java se puede serializar y enviar a través de una red (por ejemplo, a otra computadora). La secuencia de bytes se puede representar en diferentes formatos. Usted está familiarizado con este concepto por el uso ordinario de la computadora. Por ejemplo, un libro electrónico (o un documento de texto simple) se puede escribir en varios formatos diferentes:
  • docx (formato de Microsoft Word);
  • pdf (formato Adobe);
  • mobi (comúnmente utilizado en dispositivos Kindle de Amazon);
  • y mucho más (ePub, djvu, fb2, etc.).
En cada caso, el objetivo parece ser el mismo: presentar el texto en una forma legible por humanos. Aún así, la gente ha inventado muchos formatos diferentes. Sin entrar en los detalles de su trabajo, podemos suponer que tenían buenas razones. Cada formato tiene sus propias ventajas y desventajas en comparación con el resto. ¿Quizás se crearon varios formatos de serialización siguiendo estos mismos principios? ¡Excelente suposición, estudiante! :) Eso es exactamente correcto. La realidad es que enviar datos a través de un cable (o de forma inalámbrica) es un asunto complicado e involucra muchos factores. ¿Quién está enviando los datos? ¿A donde? ¿Qué volumen? ¿El destinatario será un ser humano o una computadora (es decir, los datos deben ser legibles por humanos)? ¿Qué dispositivo leerá los datos? Obviamente, estas situaciones son diferentes. Una cosa es enviar una imagen de 500 KB de un teléfono inteligente a otro. Y es algo completamente diferente si estamos hablando de 500 terabytes de datos comerciales que deben comprimirse de manera óptima y enviarse lo más rápido posible. ¡Conozcamos los principales formatos de serialización y consideremos las ventajas y desventajas de cada uno de ellos!

JSON

Notación de objetos JavaScript. ¡Ya sabes un poco sobre este formato! Hablamos de esto en esta lección y cubrimos la serialización en JSON aquí mismo . Recibió su nombre por una razón. Los objetos de Java convertidos a JSON en realidad se ven exactamente como los objetos en JavaScript. No necesitas saber JavaScript para entender nuestro objeto:

{
   "title": "War and Peace",
   "author": "Lev Tolstoy",
   "year": 1869
}
No estamos limitados a enviar un solo objeto. El formato JSON también puede representar una matriz de objetos:

[
 {
   "title": "War and Peace",
   "author": "Lev Tolstoy",
   "year": 1869
 },

 {
   "title": "Demons",
   "author": "Fyodor Dostoyevsky",
   "year": 1872
 },

 {
   "title": "The Seagull",
   "author": "Anton Chekhov",
   "year": 1896
 }
]
Debido a que JSON representa objetos de JavaScript, admite los siguientes formatos de datos de JavaScript:
  • instrumentos de cuerda;
  • números;
  • objetos;
  • arreglos;
  • booleanos (verdadero y falso);
  • nulo.
¿Cuáles son los beneficios de JSON?
  1. Formato legible por humanos. Esta es una ventaja obvia si su usuario final es humano. Por ejemplo, suponga que su servidor tiene una base de datos con un horario de vuelos. Un cliente humano, sentado frente a su computadora en casa, solicita datos de esta base de datos mediante una aplicación web. Debido a que necesita proporcionar datos en un formato que él pueda entender, JSON es una gran solución.

  2. Sencillez. Es súper simple :) Arriba, dimos un ejemplo de dos archivos JSON. E incluso si no ha oído hablar de JavaScript (y mucho menos de los objetos de JavaScript), puede comprender fácilmente el tipo de objetos que se describen allí.
    Toda la documentación de JSON consiste en una página web con un par de imágenes.

  3. Uso extendido. JavaScript es el lenguaje front-end dominante y tiene sus propios requisitos. Usar JSON es imprescindible. Por lo tanto, una gran cantidad de servicios web utilizan JSON como formato de intercambio de datos. Todos los IDE modernos admiten el formato JSON (incluido IntelliJ IDEA). Se han escrito un montón de bibliotecas para todo tipo de lenguajes de programación para permitir trabajar con JSON.

Por ejemplo, ya trabajó con la biblioteca Jackson en una lección en la que aprendimos a serializar objetos Java en JSON. Pero además de Jackson, tenemos, por ejemplo, GSON , que es una biblioteca muy conveniente de Google.

YAML

Inicialmente, YAML significaba "Yet Another Markup Language". Cuando comenzó, se posicionó como un competidor de XML. Ahora, con el paso del tiempo, YAML ha llegado a significar "YAML no es un lenguaje de marcado". ¿Qué es exactamente? Imaginemos que necesitamos crear 3 clases para representar personajes en un juego de computadora: Guerrero, Mago y Ladrón. Tendrán las siguientes características: fuerza, agilidad, resistencia, un conjunto de armas. Así es como se vería un archivo YAML que describe nuestras clases:

classes:
 class-1:
   title: Warrior
   power: 8
   agility: 4
   stamina: 7
   weapons:
     - sword
     - spear
    
 class-2:
   title: Mage
   power: 5
   agility: 7
   stamina: 5
   weapons:
     - magic staff

 class-3:
   title: Thief
   power: 6
   agility: 6
   stamina: 5
   weapons:
     - dagger
     - poison
Un archivo YAML tiene una estructura de árbol: algunos elementos están anidados en otros. Podemos controlar el anidamiento usando un cierto número de espacios, que usamos para indicar cada nivel. ¿Cuáles son las ventajas del formato YAML?
  1. Legible por humanos. Nuevamente, incluso al ver un archivo YAML sin una descripción, puede comprender fácilmente los objetos que describe. YAML es tan legible por humanos que el sitio web yaml.org es un archivo YAML ordinario :)

  2. Compacidad. La estructura del archivo se crea utilizando espacios: no es necesario utilizar corchetes ni comillas.

  3. Soporte para estructuras de datos nativas para lenguajes de programación. La gran ventaja de YAML sobre JSON y muchos otros formatos es que admite varias estructuras de datos. Incluyen:

    • !!map
      Un conjunto desordenado de pares clave-valor que no pueden tener duplicados;

    • !!omap
      Una secuencia ordenada de pares clave-valor que no pueden tener duplicados;

    • !!pares:
      una secuencia ordenada de pares clave-valor que pueden tener duplicados;

    • !!set
      Una secuencia desordenada de valores que no son iguales entre sí;

    • !!seq
      Una secuencia de valores arbitrarios;

    ¡Reconocerá algunas de estas estructuras de Java! :) Esto significa que varias estructuras de datos de lenguajes de programación se pueden serializar en YAML.

  4. Posibilidad de usar ancla y alias

    Estos marcadores le permiten identificar algún elemento en un archivo YAML y luego referirse a él en el resto del archivo si ocurre repetidamente. Se crea un ancla usando el símbolo & , y un alias se crea usando * .

    Supongamos que tenemos un archivo que describe libros de León Tolstoi. Para evitar escribir el nombre del autor de cada libro, simplemente creamos el ancla leo y nos referimos a él usando un alias cuando lo necesitamos:

    
    books:
     book-1:
       title: War and Peace
       author: &leo Leo Tolstoy
       year: 1869
    
     book-2:
       title: Anna Karenina
       author: *leo
       year: 1873
    
     book-3:
       title: Family Happiness
       author: *leo
       year: 1859
    

    Cuando se analiza este archivo, el valor "Leo Tolstoy" se sustituye en los lugares correctos donde tenemos nuestros alias.

  5. YAML puede incrustar datos en otros formatos. Por ejemplo, JSON:

    
    books: [
            {
              "title": "War and Peace",
              "author": "Leo Tolstoy",
              "year": 1869
            },
    
            {
              "title": "Anna Karenina",
              "author": "Leo Tolstoy",
              "year": 1873
            },
    
            {
              "title": "Family Happiness",
              "author": "Leo Tolstoy",
              "year": 1859
            }
          ]
    

Otros formatos de serialización

XML

Este formato se basa en un árbol de etiquetas.

<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Cada elemento consta de una etiqueta de apertura y cierre (<> y </>). Cada elemento puede tener elementos anidados. XML es un formato común que es tan bueno como JSON y YAML (si hablamos de proyectos reales). Tenemos una lección separada sobre XML .

BSON (JSON binario)

Como su nombre lo indica, BSON es muy similar a JSON, pero no es legible por humanos y usa datos binarios. Como resultado, es muy bueno para almacenar y transferir imágenes y otros archivos adjuntos. Además, BSON admite algunos tipos de datos que no están disponibles en JSON. Por ejemplo, un archivo BSON puede incluir una fecha (en formato de milisegundos) o incluso una pieza de código JavaScript. La popular base de datos MongoDB NoSQL almacena información en formato BSON.

Protocolo basado en la posición

En algunas situaciones, necesitamos reducir drásticamente la cantidad de datos enviados (por ejemplo, si tenemos muchos datos y necesitamos reducir la carga). En esta situación, podemos usar el protocolo basado en posición, es decir, enviar valores de parámetros sin los nombres de los propios parámetros.

"Leo Tolstoy" | "Anna Karenina" | 1873
Los datos en este formato ocupan varias veces menos espacio que un archivo JSON completo. Por supuesto, existen otros formatos de serialización, pero no es necesario que los conozca todos en este momento :) Es bueno si está familiarizado con los formatos estándar de la industria actual al desarrollar aplicaciones, y recuerda sus ventajas y cómo difieren de uno. otro. Y con esto, nuestra lección llega a su fin :) ¡No olvides resolver un par de tareas hoy! ¡Hasta la proxima vez! :)