Análisis del algoritmo de serialización de Java
La serialización es un proceso de describir un objeto como una serie de bytes; la deserialización es un proceso de reconstruir estos bytes en un objeto. La API de serialización de Java proporciona un mecanismo estándar para manejar la serialización de objetos. Aquí puede aprender cómo serializar un objeto, cuándo se requiere la serialización y el algoritmo de serialización de Java. Usamos un ejemplo para demostrar cómo los bytes después de la serialización describen la información de un objeto.
La necesidad de serialización
En Java, todo es un objeto. En un entorno distribuido, a menudo es necesario transferir objetos de una red o dispositivo a otro. Esto requiere un protocolo que pueda transmitir datos en ambos extremos. El mecanismo de serialización de Java fue creado para resolver este problema.
Cómo serializar un objeto
El requisito previo para que un objeto sea serializable es implementar la interfaz Serializable. La interfaz Serializable no tiene métodos y es más como un marcador. Las clases con esta etiqueta pueden ser procesadas por el mecanismo de serialización.
100.
El formato de serialización del objeto.
¿Cómo se ve un objeto después de ser serializado? Abra el archivo temp.out que acabamos de serializar y generar el objeto, y muéstrelo en hexadecimal. El contenido debe ser el siguiente:
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
versión de bytes públicos = 100;
recuento de bytes públicos = 0;
Ambos son de tipo byte, en teoría solo se necesitan 2 bytes para almacenar estos dos campos, pero en realidad temp.out ocupa 51 bytes, lo que significa que además de los datos, también incluye otras descripciones del objeto serializado.
Algoritmo de serialización de Java
El algoritmo de serialización generalmente realiza los siguientes pasos:
◆ Metadatos de clase de salida relacionados con instancias de objetos.
◆ Genera de forma recursiva la descripción de superclase de la clase hasta que no haya más superclases.
◆ Una vez completados los metadatos de la clase, los valores de datos reales de la instancia del objeto se generan a partir de la superclase de nivel superior.
◆ Generar datos de instancia de forma recursiva de arriba a abajo
Ilustremos con otro ejemplo que cubre de forma más completa todas las situaciones posibles:
la clase contiene implementos serializables {
int contieneVersión = 11;
}
La clase pública SerialTest extiende los implementos principales Serializable {
versión int = 66;
contener con = nuevo contener();
público int getVersion() {
versión de retorno;
}
public static void main (String args []) lanza IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = nuevo ObjectOutputStream(fos);
SerialTest st = nueva SerialTest();
oos.writeObject(st);
oos.flush();
oos.cerrar();
}
}
El formato serializado es el siguiente:
AC ED 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A CA 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000A 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000B
Echemos un vistazo más de cerca a lo que representan estos bytes. Comenzando, ver color:
El primer paso en el algoritmo de serialización es generar una descripción de la clase relacionada del objeto. El objeto que se muestra en el ejemplo es una instancia de la clase SerialTest, por lo que la descripción de la clase SerialTest se muestra a continuación. Ver colores:
A continuación, el algoritmo genera uno de los campos, inversión=66 ver color:
Luego, el algoritmo genera el siguiente dominio, contiene con = nuevo contiene(); esto es un poco especial, es un objeto. Al describir referencias de tipos de objetos, debe utilizar la notación de firma de objetos estándar de JVM; consulte el color:
Luego, el algoritmo generará la descripción de la superclase, que es la clase principal. Vea el color:
A continuación, genere la descripción del dominio de la clase principal, intparentVersion=100; consulte también color:
Hasta ahora, el algoritmo ha generado las descripciones de todas las clases. El siguiente paso es generar el valor real del objeto de instancia. En este momento, comienza desde el dominio de la clase principal, consulte el color:
También hay campos de la clase SerialTest:
Los bytes que siguen son más interesantes. El algoritmo necesita describir la información de la clase contenedora. Recuerde, la clase contenedora aún no se ha descrito.
.Envíe la descripción de dominio única de contener, intcontainVersion=11;
En este momento, el algoritmo de serialización verificará si contiene una superclase y, de ser así, la generará.
Finalmente, se genera el valor de dominio real de la clase contenedora.
Bien, hemos discutido el mecanismo y los principios de la serialización de Java y esperamos que sea útil para los estudiantes.