Red de conocimiento informático - Conocimiento del nombre de dominio - Principios de serialización

Principios de serialización

La ventaja de la serialización XML es que es muy legible y fácil de leer y depurar. Sin embargo, el archivo de código de bytes serializado es relativamente grande e ineficiente, lo que es adecuado para escenarios de intercambio de datos entre sistemas internos de nivel empresarial con bajo rendimiento y bajo QPS. Al mismo tiempo, XML es independiente del lenguaje, por lo que también se puede utilizar para. Intercambio de datos y protocolos entre sistemas heterogéneos. Por ejemplo, el servicio web que conocemos serializa datos en formato XML. Hay muchas formas de implementar la serialización/deserialización XML, incluida XStream y la serialización y deserialización XML propias de Java.

JSON (Notación de objetos JavaScript) es un formato de intercambio de datos liviano. JSON (Notación de objetos JavaScript) es un formato de intercambio de datos liviano. En comparación con XML, el flujo de bytes JSON es más pequeño y muy legible. Ahora, el formato de datos JSON es el más utilizado en las empresas y existen muchas herramientas de código abierto de serialización JSON de uso común

Entre estas herramientas de serialización json, Jackson y fastjson tienen mejor rendimiento que GSON, pero Jackson y GSON La estabilidad es mejor que Fastjson. La ventaja de fastjson es que la API que proporciona es muy fácil de usar

Hessian es un protocolo de serialización binaria que admite la transmisión entre idiomas. En comparación con el mecanismo de serialización predeterminado de Java, Hessian tiene mejor rendimiento y facilidad de uso, y admite muchos lenguajes diferentes

De hecho, Dubbo usa la serialización de Hessian, pero para obtener un mejor rendimiento, Dubbo refactoriza Hessian

Avro es un sistema de serialización de datos diseñado para soportar aplicaciones que intercambian grandes cantidades de datos. Sus características principales son: admite el método de serialización binaria, que puede procesar grandes cantidades de datos de manera conveniente y rápida, siendo amigable con los lenguajes dinámicos, Avro proporciona un mecanismo que permite que los lenguajes dinámicos procesen fácilmente los datos de Avro

Kryo; es una implementación de serialización muy madura que se ha utilizado ampliamente en Hive y Storm), pero no puede cruzar idiomas. Actualmente, dubbo admite el mecanismo de serialización de kyro en la versión 2.6. Es superior a su predecesor hessian2

Protobuf es un formato de intercambio de datos de Google independiente del idioma y de la plataforma. Google proporciona implementaciones en múltiples lenguajes como Java, C, Go y Python, cada uno de los cuales incluye compiladores y bibliotecas para el lenguaje correspondiente. Protobuf es un protocolo de capa de presentación puro que se puede utilizar con varios protocolos de capa de transporte.

Protobuf se usa ampliamente, principalmente debido a su baja sobrecarga de espacio y mejor rendimiento, por lo que es muy adecuado para llamadas RPC internas con requisitos de alto rendimiento. Además, debido a su alto rendimiento de análisis y su cantidad relativamente pequeña de datos serializados, también se puede utilizar en escenarios de persistencia de objetos. Sin embargo, dado que Protobuf tiene su propia sintaxis y compilador, su uso es relativamente problemático. Por lo tanto, si necesita usarlo, debe invertir en aprender tecnologías relacionadas.

La desventaja de protobuf es que cada estructura de clases. que debe ser transferido es un objeto separado. La desventaja de protobuf es que debe generar un archivo proto para cada estructura de clase transferida, y si se modifica una clase, debe regenerar el archivo proto para la clase nuevamente

Varias tecnologías de serialización Comparación de rendimiento

Puede encontrar una comparación de rendimiento de diferentes tecnologías de serialización en: /eishay/jvm-serializers/wiki

Usar protobuf es una forma muy sencilla de aprovechar las tecnologías de serialización. Y la manera fácil.

p>

Los pasos generales para desarrollar usando protobuf son

Escribir archivos proto

Tipo de datos

cadena/bytes/bool/int32 (4 bytes)

/int64 / float / double

clase de enumeración de enumeración

clase personalizada de mensaje

clase de personalización de mensaje

Modificadores

requerido indica campos obligatorios

opcional indica campos opcionales

repetido se puede repetir y representa una colección

1 , 2, 3, 4 deben ser únicos en el alcance actual, indicando el orden

Generar clase de entidad

Serialización

Salida: 10 3 77 105 99 16 -84 2

Como puede ver, los números serializados son básicamente incomprensibles, pero los datos serializados son realmente muy pequeños. Entendamos el principio básico.

p>

Generalmente, en. Para lograr el resultado de serialización más pequeño posible, utilizaremos tecnología de compresión. tecnología, y protobuf usa dos

algoritmos de compresión, uno es varint y el otro es zigzag

-varint

Primero, echemos un vistazo ¿Cómo es age= ¿300 comprimidos?

El resultado de estos dos bytes es -84, 2

-84. ¿Cómo se calcula esto? Sabemos que en la representación binaria de números negativos, el bit alto se establece en 1, se realiza la inversión binaria con el número correspondiente y luego se calcula el complemento de la representación (el complemento es el código de inversión + 1)

Por lo tanto, si desea calcular a la inversa

Cómo convertir caracteres en códigos

el carácter "Mic", debe realizar la conversión de acuerdo con la tabla ASCII. Debe convertirse a un número según la tabla de búsqueda ASCII.

M = 77, i = 105, c = 99

Entonces el resultado es 77 105 99

¿Por qué el resultado aquí está codificado directamente en ASCII? ¿Por qué no hay compresión?

La razón es que varint comprime el código de bytes, pero si el número tiene solo un byte binario, el resultado final de la codificación no cambia.

¿Qué pasa con los otros dos números 3 y 16? Entonces necesitas comprender el formato de almacenamiento de protobuf

Formato de almacenamiento

protobuf usa T-L-V como método de almacenamiento

La fórmula de cálculo de la etiqueta es número_campo (actual número de campo) << ;3 | tipo_alambre

Por ejemplo, el número de campo del micrófono es 1 y su tipo es tipo_alambre

El número de campo del micrófono es 1 y su tipo es tipo_alambre

Campo del micrófono El número es 1 y el tipo es wire_type

Por ejemplo, el número de campo del Micrófono es 1. Por ejemplo, el número de campo de Mic es 1 y el valor de tipo wire_type es 2, entonces: 1 <<3 | 2 = 10

El número de campo de edad=300 es 2 y el valor del tipo wire_type es 0 , por lo tanto: 2<<3|0 = 16

El primer número 10 representa la clave, y el resto son valores