En Java, todo es un objeto, y en un entorno distribuido, a menudo es necesario pasar un objeto desde un extremo de la red o dispositivo al otro extremo. Esto requiere un protocolo que pueda transmitir datos en ambos extremos. El mecanismo de serialización de Java se crea para resolver este problema.
Después de convertir el estado del objeto en una secuencia de bytes, puede guardarlo en un archivo utilizando clases de varias transmisiones de bytes en el paquete Java.io, tuve en otro hilo o enviar datos de objetos a otro host a través de una conexión de red. La función de serialización del objeto es muy simple y potente, y se usa en RMI, Socket, JMS y EJB. El problema de serialización del objeto no es el problema más central en la programación de redes, pero es muy importante y tiene muchos significados prácticos.
La serialización del objeto Java no solo conserva los datos de un objeto, sino que también guarda de manera recursiva los datos de cada objeto referenciado por el objeto. Toda la jerarquía de objetos se puede escribir en una secuencia de bytes, guardar en un archivo o pasar en una conexión de red. La serialización del objeto se puede usar para realizar una "copia profunda" del objeto, es decir, copiar el objeto en sí y el objeto en el referenciado mismo. La serialización de un objeto puede dar lugar a una secuencia de todo el objeto.
Método de uso básico:
La serialización se refiere a persistir una clase o tipo de datos básicos en un flujo de datos, incluido el archivo, la secuencia de bytes y la secuencia de datos de red.
La implementación de la serialización en Java se basa principalmente en dos clases: ObjectOutTream y ObjectInputStream. Son subclases de OutputStream y InputStream en el sistema Java IO. Dado que son transmisiones en Java IO, pueden operarlas como transmisiones. Así es como se usan:
import java.io.bytearrayInputStream; import java.io.bytearrayOutputStream; import java.io.ioException; import java.io.objectInputStream; import java.io.objectOutputStream; import java.io.serializable; El par de clase pública implementa serializable {private static final long serialversionUid = -1874850715617681161l; Tipo de intivate privado; nombre de cadena privada; public int getType () {Tipo de retorno; } public void settype (int type) {this.type = type; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } Public Par (int type, String Name) {super (); this.type = type; this.name = name; } public static void main (string [] args) lanza ioexception, classnotFoundException {// tODO Auto Generated Method stub // Serialize Object Par ByTearRayOutPutStream Bos = new ByTearRaReOutputStream (); ObjectOutputStream oos = new ObjectOutputStream (BOS); Par de par = nuevo par (1, "Charlie"); oos.writeObject (par); // Deserialize Object, obtenga el nuevo objeto Newpair bytearrayInputStream bis = new ByteArrayInputStream (bos.tobytearray ()); ObjectInputStream OIS = new ObjectInputStream (BIS); Par Newpair = (par) ois.readObject (); System.out.println (newpair.gettype ()+":"+newpair.getName ()); }}1. Ambas clases están en el patrón del decorador. Al crearlos, deben pasar en una transmisión basada en bytes. Estas transmisiones son las que realmente almacenan datos serializados a continuación.
2. La clase persistida necesita implementar la interfaz serializable. Esta interfaz no tiene funciones, pero es solo una interfaz de marcado. Si la serialización se realiza en una máquina y los datos resultantes se transmiten a otra máquina para la deserialización, entonces las clases en estas dos máquinas deberían ser exactamente las mismas, de lo contrario la serialización no tendrá éxito.
3. Recuerde no usar ToString para obtener la cadena en el código anterior, luego obtener el bytearrayInputStream de esta cadena y luego deserializarla. Bos se almacena en bytes. La conversión a la cadena almacenada en caracteres inevitablemente causará cambios de datos, y el byte [] extraído de la cadena no será el byte anterior []. He encontrado este problema porque quiero almacenar los datos serializados en el archivo XML. Vea otro artículo en mi solución específica a este problema:
www.vevb.com/article/88130.htm
¿Qué hace la máquina virtual Java al serializarla y deserializarla?
El mecanismo de serialización de Java en la descripción de estas dos clases se describe en detalle en Javadoc:
Cita
El mecanismo de serialización predeterminado para un objeto escribe la clase del objeto, la firma de clase y los valores de todos los campos no transitorios y no estatales. Las referencias a otros objetos (excepto en campos transitorios o estáticos) hacen que esos objetos también se escriban. Múltiples referencias a un solo objeto se codifican utilizando un mecanismo de intercambio de referencia para que los gráficos de objetos se puedan restaurar a la misma forma que cuando se escribió el original.
El mecanismo de serialización predeterminado escribe datos en la secuencia incluye:
1. La clase a la que pertenece el objeto
2. Firma de clase
3. Todas las propiedades no transitoras y no estáticas
4. Las referencias a otros objetos también causarán serialización de estos objetos.
5. Si múltiples referencias apuntan a un objeto, entonces se utilizará el mecanismo de referencia para compartir.
Cita
Las clases que requieren un manejo especial durante el proceso de serialización y deserialización deben implementar métodos especiales con estas firmas exactas:
Private void ReadObject (Java.io.ObjectInputStream Stream) lanza IOException, ClassNotFoundException; Private void writeObject (java.io.ObjectOutputStream Stream) arroja ioException private void readObjectNodata () lanza ObjectStreamException;