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
-
La secuencia de bytes del objeto se guarda permanentemente en el disco duro, generalmente en un archivo.
-
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
Guarde el contenido del archivo como cosas serializadas que no entendemos
Nota
-
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.
-
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.
-
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.