Java的序列化和反序列化大家基本上都听说过,但是一旦问到底层是怎么实现的,大家一般就很少关注了,今天我们一起来看看它们到底是怎么实现的。
1、序列化反序列化的作用
Java的序列化和反序列化的主要作用就是用在两个Java进程之间相互传输时所使用。因为利用序列化和反序列化,我们可以实现两个进程间的Java对象传输。
序列化:将Java对象按照一定的格式输出为字节序列,它可以完整的保持Java对象的所有状态和描述信息。从而将其传递给另外的Java进程或者保存在本地。其最核心的工作量就在于Java对象的分解和重建。
反序列化:顾名思义,Java序列化的反过程,将已经序列化的字节序列转化成有效完整的Java对象的过程,这就是反序列化。
2、序列化的好处
序列化的主要优点在于三点:
1、序列化提供了一种将Java对象持久化的一种方式,序列化后的字符序列可以保存在本地,在下次需要使用时直接读取进入内存中使用。
2、使得Java对象可以在两个Java进程之间进行传输了。
3、提供了一种方式可以使得Java对象能够通过网络之间进行通信传输。
3、序列化的具体流程和特点
序列化的主要流程有以下四点:
1、首先将相关的所有对象的类元数据全部按格式输出;
2、按照递归的顺序将该类的所有父类的类描述全部序列化输出(即自下而上输出类描述);
3、递归输出完所有的类元数据之后,从最上层的父类开始先输出Java对象的所有实例信息(即自上而下输出实例信息);
4、最后输出待序列化的类实例的所有信息;
4、序列化的例子
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerialDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
FileOutputStream fos = new FileOutputStream("D://test.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
User user1 = new User("dt", "12345678", "male");
oos.writeObject(user1);
oos.flush();
oos.close();
//反序列化
FileInputStream fis = new FileInputStream("D://test.out");
ObjectInputStream ois = new ObjectInputStream(fis);
User user2 = (User) ois.readObject();
System.out.println(user2.getUserName()+ " " +
user2.getPassword() + " " + user2.getSex());
//反序列化的输出结果
}
}
class User implements Serializable {
private String userName;
private String password;
private String sex;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public User(String userName, String password, String sex) {
super();
this.userName = userName;
this.password = password;
this.sex = sex;
}
}