Serialización y deserialización de Java

1. ¿Qué es la serialización y la deserialización?

La serialización de Java se refiere al proceso de convertir objetos de Java en secuencias de
bytes.La deserialización de Java se refiere al proceso de restaurar secuencias de bytes en objetos de Java .

2. Por qué serializar un objeto

En circunstancias normales, los objetos nuevos de Java se almacenan en la memoria y no se pueden persistir, ni se pueden transmitir directamente a través de la red.¿Cómo solucionarlo? Es convertir objetos Java en datos de bytes y realizar almacenamiento persistente y transmisión de red en bytes. Y la deserialización consiste en restaurar los datos que se serializarán en objetos Java en la memoria.
En resumen, la serialización es el proceso de guardar y reconstruir un objeto Java.

En tercer lugar, el proceso de serialización de Java

Para hacer que un objeto Java sea serializable, necesitamos implementar la interfaz Serializable para el objeto Java. Como se muestra a continuación, este método hereda esta interfaz más que los beans ordinarios. Esta interfaz no implementa ningún método. ¿Por qué le dice al compilador, esta interfaz se puede serializar.


@Data
public class User implements Serializable {
    
    


    private String name;

    private int age;

    private String  sex;

    private String phone;


}

Esta clase se puede serializar, pero ¿cómo serializarla para almacenarla localmente? Ejecute el siguiente método de escritura para crear un archivo serializado de la clase Usuario en el directorio raíz de la unidad D y ejecute el método de lectura para convertir el archivo serializado en un objeto.

public class Client {
    
    

    @Test
    public void write() throws Exception{
    
    
        User user = new User();
        user.setAge(15);
        user.setName("张三");
        user.setPhone("123");
        FileOutputStream fileOutputStream = new FileOutputStream("D://out.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(user);

    }

    @Test
    public void read() throws Exception{
    
    
        FileInputStream fileInputStream = new FileInputStream("D://out.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        User o = (User)objectInputStream.readObject();
        System.out.println(o.toString());
    }

}

El resultado de la operación del método de lectura, el objeto serializado, tiene el valor del objeto antes de la serialización.

inserte la descripción de la imagen aquí

4. Objetos que no se pueden serializar

En un objeto Java, si un campo es modificado por transient , o el campo es un campo estático estático, la clase no se serializará, lo que significa que después de serializar y deserializar el objeto en un objeto Java nuevamente, el valor del campo es nulo.
inserte la descripción de la imagen aquí

Cinco, el papel del número de serie.

Nuestra clase cambia constantemente. Después de serializar un objeto en un archivo local, un día, la clase de este objeto cambia y usamos esta clase modificada para recibir el archivo serializado. ¿Qué sucederá? Comente el nombre y la edad, y luego deserialice.

public class User implements Serializable {
    
    


//     private String name;
//
//    transient private int age;

    private String  sex;

    private String phone;

    
}

public class Client {
    
    

    @Test
    public void write() throws Exception{
    
    
        User user = new User();
//        user.setAge(15);
//        user.setName("张三");
        user.setPhone("123");
        FileOutputStream fileOutputStream = new FileOutputStream("D://out.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(user);

    }

    @Test
    public void read() throws Exception{
    
    
        FileInputStream fileInputStream = new FileInputStream("D://out.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        User o = (User)objectInputStream.readObject();
        System.out.println(o.toString());
    }

}




El resultado es

java.io.InvalidClassException: com.example.service.demo01.User; clase local incompatible: stream classdesc serialVersionUID = -118799779803260725, clase local serialVersionUID = 1681826866445576943

¿Qué significa este error? Es porque el número de serie de esta clase es diferente al de la clase en el archivo de serialización y no se puede deserializar.
Aquí viene la pregunta, ¿qué es un número de serie?

El número de serie es un dato entero largo. El número de serie de una clase se calcula en función de las variables miembro de la clase. Si las variables miembro cambian, el número de serie también cambiará. Solo el número de serie del archivo serializado y el número de serie número de la clase Si los números son iguales, la deserialización se realiza correctamente.
Entonces, este error es fácil de entender. Antes del cambio, la clase tiene tres variables, se supone que el valor del número de serie es 3 y el archivo serializado también es 3. Después de eliminar una variable, solo quedan dos variables, suponiendo que el número de serie sea 2, este no es el mismo que el número de serie del archivo serializado, por lo que no se puede deserializar.

A veces, esperamos que incluso si la clase cambia, la deserialización puede ser exitosa. Por ejemplo, solo quedan 3 campos en el pasado y el archivo serializado tiene 4 campos. Solo serializamos los campos que tiene la clase actual, luego ¿Cómo hacer?
Podemos configurar manualmente el número de serie para una clase, así: De
inserte la descripción de la imagen aquí
esta manera, incluso si la clase ha cambiado, pero el número de serie se ha escrito manualmente hasta el final, no importa cómo cambie la clase, la deserialización no informará un error. , solo los valores del número de serie que también pueden coincidir.

Supongo que te gusta

Origin blog.csdn.net/qq_45171957/article/details/123858691
Recomendado
Clasificación