Principios de serialización
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