Serialization 序列化
序列化指把 Java 对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程。
为什么需要序列化?
通过序列化能够实现对内存中的 对象对象进行持久化保存 或 网络传输。
无论是什么文件,通过序列化,最终都变成了字节流,能够以通用的格式进行传输或保存。
要想再次使用,就使用反序列化进行还原,对象还是对象,文件还是文件。
Java 对象实现 序列化 与 反序列化
要想让某一个类支持 序列化 与反 序列化非常简单,只需要让这个类实现 Serializable 接口即可,我们只需要在类的声明时写上 implements Serializable 即可,不需要做额外修改(比如重写方法)。
我们定义一个 Student 类:
public class Student implements Serializable {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
随后进行序列化和反序列化操作:
// 对 Student 进行 序列化 和 反序列化
public class SerializationTest {
public static void main(String[] args) {
Student stu1=new Student(20210010,"Tom");
//序列化
try {
FileOutputStream fos = new FileOutputStream("Tom.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
//清空缓冲,关闭窗口
fos.flush();
oos.flush();
fos.close();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
//反序列化
try {
FileInputStream fis=new FileInputStream("Tom.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu2 = (Student)ois.readObject();
//关闭窗口
fis.close();
ois.close();
System.out.println(stu2);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在序列化过程中, 我们额外用到了两个类:
FileOutputStream, 文件输出流,用来指定输出文件的名称
ObjectOutputStream, 对象输出流,将对象写入文件中
在反序列化过程中, 我们额外用到了两个类:
FileInputStream, 文件输入流,用来指定读取文件的名称
ObjectInputStream, 对象输入流,将对象读到程序中
特别说明, 在输出缓冲流关闭前需要将缓冲清空, 也就是将缓冲区的内存释放调。
Last updated
Was this helpful?