[Serialización Java, serialización JSON, serialización Hesse]

Introducción

Los objetos de datos en la memoria solo se pueden convertir en flujos binarios para la persistencia de los datos y la transmisión de red. El proceso de convertir objetos de datos en flujos binarios se llama serialización de objetos.
Por el contrario, el proceso de restaurar el flujo binario en un objeto de datos se llama deserialización.
La serialización debe retener suficiente información para restaurar el objeto de datos, pero para ahorrar espacio de almacenamiento y ancho de banda de la red, el flujo binario serializado debe ser lo más pequeño posible.
Un escenario de uso común para la serialización es la transmisión de datos en el marco RPC. Hay tres métodos de serialización comunes:

Serialización nativa de JAVA

Las clases de Java implementan la serialización de objetos de esta clase implementando la interfaz Serializable, esta interfaz es muy especial y no tiene ningún método, solo sirve como identificador.
La serialización de Java conserva los metadatos de la clase de objeto (como clases, variables miembro, información de clase heredada, etc.), así como los datos del objeto, etc., y tiene la mejor compatibilidad, pero no admite varios idiomas y tiene un promedio rendimiento .
Para las clases que implementan la interfaz serializable, se recomienda establecer el valor del campo serialVersionUID . Si no se establece, el compilador generará automáticamente serialVersionUID en función de la implementación interna de la clase, incluido el nombre de la clase, el nombre de la interfaz, los métodos, las propiedades, etc. hora en que se ejecuta.
Si se modifica el código fuente de la clase, el valor de serialVersionUID puede cambiar después de la recompilación. Por lo tanto, las clases que implementan la interfaz serializable deben definir explícitamente el valor del atributo serialVersionUID.
Al modificar una clase, debe decidir si desea modificar el serialVersionUID según la compatibilidad. Si se trata de una actualización compatible, no modifique el campo serialVersionUID para evitar fallas de deserialización.
Si no es compatible con la actualización, debe modificar el valor serialVersionUID para evitar confusiones en la deserialización.
Cuando utilice la serialización nativa de Java, tenga en cuenta que durante la deserialización de Java, no se llamará al constructor sin parámetros de la clase, pero se llamará al método nativo para asignar la variable miembro al valor inicial del tipo correspondiente.
Debido a consideraciones de rendimiento y compatibilidad, no se recomienda la serialización nativa de Java .

serialización de arpillera

La serialización de Hesse es un protocolo de red que admite la transmisión basada en objetos, en varios idiomas y escrita dinámicamente.
Los flujos binarios serializados de objetos Java se pueden deserializar mediante otros lenguajes (C++/Python). El protocolo Hessian tiene las siguientes características:
Tipos de serialización autodescriptivos. Utilice un byte para representar tipos básicos comunes sin depender de archivos de descripción externos o definiciones de interfaz.

  • Acorte drásticamente el flujo binario.
  • Independiente del idioma, admite lenguajes de secuencias de comandos.
  • El protocolo es simple y más eficiente que la serialización nativa de Java.

En comparación con Hessian 1.0, Hessian 2.0 agrega codificación de compresión. Su tamaño de flujo binario serializado es el
50% de la serialización de Java, el tiempo de serialización es el 30% de la serialización de Java y el tiempo de deserialización es el 20
% de la deserialización de Java. Hessian almacenará todas las propiedades de objetos complejos en un mapa para la serialización.
Por lo tanto, cuando la clase principal y la subclase tienen variables miembro con el mismo nombre, cuando Hessian serializa, la clase secundaria se serializa primero y luego la clase principal se serializa, por lo que la deserialización Como resultado, el
miembro La variable de la subclase con el mismo nombre será sobrescrita por el valor de la clase principal.
Alta eficiencia, mala compatibilidad, no recomendado .

Serialización JSON

JSON (notación JavaScript, etc.) es un formato de intercambio de datos ligero . La serialización JSON consiste en convertir objetos de datos en cadenas JSON.
La información de tipo se descarta durante el proceso de serialización, por lo que solo la información de tipo se puede deserializar con precisión durante la deserialización. En comparación con los dos primeros métodos, JSON es más legible y conveniente para la depuración .
La serialización generalmente transmite objetos a través de la red y los objetos a menudo contienen datos confidenciales, por lo que la serialización a menudo se convierte en un punto de ataque para los piratas informáticos. Los atacantes utilizan inteligentemente el proceso de deserialización para construir código malicioso, lo que hace que el programa ejecute código arbitrario durante el proceso de deserialización.
Se han producido vulnerabilidades de deserialización en Apache Commons Collections Jackson fastjson y otras que se utilizan ampliamente en proyectos Java. ¿Cómo prevenir este tipo de ataques de piratas informáticos?
Algunos atributos confidenciales de los objetos no necesitan serializarse ni transmitirse. Puede agregar la palabra clave transitoria para evitar convertir la información de este atributo en un flujo binario serializado .
Si debe transferir atributos confidenciales de un objeto, puede usar cifrado simétrico y asimétrico para transmitirlos de forma independiente y luego usar un método para restaurar los atributos del objeto.
Los desarrolladores de aplicaciones deben tener cierto conocimiento de las precauciones de seguridad para la serialización, verificar el contenido de los datos entrantes o controlar los permisos y actualizar las vulnerabilidades de seguridad de manera oportuna para evitar ataques.
Los puntos de conocimiento anteriores provienen de Efficient Code: Manual de desarrollo de Java. Este artículo es una nota posterior a la lectura y se comparte con todos como una nota.

La serialización JSON se usa a menudo en el desarrollo real. Por ejemplo:
Código de muestra
esta interfaz usa la serialización JSON. El objeto de parámetro de entrada usa la anotación @RequestBody para convertir los parámetros de entrada en un objeto Java. La anotación @ResponseBody se usa para convertir el valor de retorno del interfaz en formato JSON.Return, un ejemplo típico de referencia de serialización JSON.


Supongo que te gusta

Origin blog.csdn.net/uziuzi669/article/details/123003806
Recomendado
Clasificación