Serialización y deserialización de Java detalladas

Consejos antes de ver:

La versión de Eclipse utilizada en este artículo es Photon Release (4.8.0), la versión IDEA es la última 2019.1, la versión JDK es 1.8.0_141 y la versión Tomcat es 9.0.12.

1. Conceptos básicos

1.1 Definición

Serialización: el proceso de convertir un objeto en una secuencia de bytes se llama serialización del objeto.

Deserialización: el proceso de restaurar una secuencia de bytes en un objeto se denomina deserialización de objetos.

1.2 Propósito

  1. La secuencia de bytes del objeto se guarda permanentemente en el disco duro, generalmente en un archivo.

  2. Transfiera la secuencia de bytes del objeto en la red.

2. Realizar la serialización y deserialización

2.1 API de serialización en la biblioteca JDK

Clases clave en JDK ObjectOutputStream (flujo de salida del objeto) con ObjectInputStream (flujo de entrada de objeto)

Clase ObjectOutputStream: escriba el objeto en formato binario utilizando el método writeObject (objeto objeto).

Clase ObjectInputStream: lea el flujo binario del flujo de entrada y conviértalo en un objeto utilizando el método readObject ().

2.2 Implementar interfaz serializable

Todos los atributos de este objeto (incluidos los atributos privados y los objetos a los que hace referencia) se pueden serializar y deserializar para guardar y transferir. Los campos que no se quieren serializar se pueden modificar con transient.

Los ejemplos son los siguientes

Person.java que implementa la interfaz serializable

package testSerialize;

import java.io.Serializable;

public class Person implements Serializable {
    
    

    private static final long serialVersionUID = 1351786752651948395L;

    private String id;
    private String name;
    private transient int age;

    public String getId() {
    
    
        return id;
    }

    public void setId(String id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Clase de prueba Test.java

package testSerialize;

import java.io.*;

public class Test {
    
    

    public static void main(String[] args){
    
    

        // 序列化
        Person person = new Person();
        person.setId("123456");
        person.setName("张三");
        person.setAge(18);
        // ObjectOutputStream输出流,将Person对象存储到文件中,实现序列化
        ObjectOutputStream os = null;
        try {
    
    
            os = new ObjectOutputStream(new FileOutputStream("D:test.txt"));
            os.writeObject(person);
            os.close();
        } catch (Exception e){
    
    
            e.printStackTrace();
        } finally {
    
    
            if (os != null){
    
    
                try {
    
    
                    os.close();
                } catch (Exception e){
    
    

                }
            }
        }
        System.out.println("--------------------序列化完成--------------------");

        // 反序列化
        ObjectInputStream is = null;
        try {
    
    
            is = new ObjectInputStream(new FileInputStream("D:test.txt"));
            Person p = (Person) is.readObject();
            System.out.println(p.toString());
        } catch (Exception e){
    
    
            e.printStackTrace();
        } finally {
    
    
            if (is != null){
    
    
                try {
    
    
                    is.close();
                } catch (Exception e){
    
    

                }
            }
        }
        System.out.println("--------------------反序列化完成--------------------");
    }
}

Los resultados son los siguientes
Inserte la descripción de la imagen aquí

Guarde el contenido del archivo como cosas serializadas que no entendemos
Inserte la descripción de la imagen aquí

Nota

  1. La función de la interfaz serializable es solo para identificar que nuestra clase necesita ser serializada y la interfaz serializable no proporciona ningún método.

  2. SerialVersionUid El número de versión serializado se usa para distinguir la versión de la clase que escribimos, y se usa para determinar si la versión de la clase es consistente durante la deserialización. Si es inconsistente, ocurrirá una excepción de versión inconsistente.

  3. palabra clave transitoria, utilizada principalmente para ignorar variables que no queremos serializar

2.3 Implementar interfaz externalizable

Es una subclase de interfaz serializable, lo que el usuario quiere lograr == writeExternal ()conEl método readExternal () == se utiliza para determinar cómo serializar y deserializar.

Supongo que te gusta

Origin blog.csdn.net/weixin_43611145/article/details/108715676
Recomendado
Clasificación