前言
对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了。停留在了表面,在项目中使用Dubbo时,发现对象需要实现Serializbale,涉及到了序列化问题。就补了一下Java序列化的底层实现。
1.What
- Java序列化 是指把Java对象保存为二进制字节码的过程;
- Java反序列化 是指把二进制字节码重新转换成Java对象的过程。
那么为什么需要序列化呢?
第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。
第二种情况是:需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象。
2.How
演示demo
使用一个demo演示一下:
import java.io.*;
public class Student implements Serializable {
private static final long serialVersionUID = -7067671538866851177L;
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public static void main(String[] args) throws Exception {
// 1. 序列化:对象->文件
FileOutputStream fileOutputStream = new FileOutputStream("student.out");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
Student writeStudent = new Student();
writeStudent.setId(1);
writeStudent.setName("xiao");
writeStudent.setAge(25);
objectOutputStream.writeObject(writeStudent);
objectOutputStream.flush();
objectOutputStream.close();
// 2.反序列化:文件->对象
FileInputStream fileInputStream = new FileInputStream("student.out");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Student readStudent = (Student) objectInputStream.readObject();
System.out.println("sutudent id :" + readStudent.getId());
System.out.println("sutudent name :" + readStudent.getName());
System.out.println("sutudent age :" + readStudent.getAge());
}
}
输出结果:
sutudent id :1
sutudent name :xiao
sutudent age :25
查看二进制文件
使用二进制编辑器(如: Synalyze It Pro Mac)查看 student.out 文件
3.Why
1.调用ObjectOutputStream.writeObject()和ObjectInputStream.readObject()之后究竟做了什么?
1. Serializable 接口
查看 Serializable 接口,可以发现这个接口没有任何方法或字段。
/*
* @author unascribed
* @see java.io.ObjectOutputStream
* @see java.io.ObjectInputStream
* @see java.io.ObjectOutput
* @see java.io.ObjectInput
* @see java.io.Externalizable
* @since JDK1.1
*/
public interface Serializable {
}
查看注释可以看到:
The serialization interface has no methods or field