1、什么是序列化与反序列化
序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制串的过程。
反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
2、为什么要序列化
①、在分布式系统中,此时需要把对象在网络上传输,就得把对象数据转换为二进制形式,需要共享的数据的 JavaBean 对象,都得做序列化。
②、服务器钝化:如果服务器发现某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(Java对象转换为二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成 Java 对象。这样能节省服务器内存。
3、Java 怎么进行序列化?
①、需要做序列化的对象的类,必须实现序列化接口:Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法),Java 中大多数类都实现了该接口,比如:String,Integer
②、底层会判断,如果当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断。
③、在 Java 中使用对象流来完成序列化和反序列化
ObjectOutputStream:通过 writeObject()方法做序列化操作
ObjectInputStream:通过 readObject() 方法做反序列化操作
image.png
package com.SerializeDemo;
import java.io.Serializable;
public class Person implements Serializable {
public enum Sex{
Female,
Male
}
private static final long serialVersionUID = 8656128222714547171L;
transient private String name;
private int age;
private Sex sex;
Person(String name,int age){
this.name= name;
this.age=age;
this.sex = Sex.Female;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public Sex getSex() {
return sex;
}
public void setName(String name) {
this.name = name;
}
public void setSex(Sex sex) {
this.sex = sex;
}
}
package com.SerializeDemo;
import java.io.*;
public class SerializeDemo {
public static void main(String[] args) throws ClassNotFoundException {
try {
OutputStream outputStream = new FileOutputStream(System.getProperty("user.dir")+"/src/main/java/com/SerializeDemo/"+ File.separator+"person.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(new Person("Monica",19));
objectOutputStream.close();
InputStream inputStream = new FileInputStream(System.getProperty("user.dir")+"/src/main/java/com/SerializeDemo/"+ File.separator+"person.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Person person = (Person) objectInputStream.readObject();
System.out.println(person.getSex());
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1、不需要序列化的字段用transient修饰;
2、JavaBean 对象中增加一个 serialVersionUID 字段,用来固定版本,避免反序列化失败;
网友评论