一. 基础理论知识
📌怎么理解对象输入输出流 ?
○ 把java中的对象输出到文件中,从文件中把对象输入到程序中.
📌为什么要这样做(目的) ?
当我们创建一个对象时, 如new Student( "小张",20 ); 数据存储在对象中, 对象是在内存中存储的,一旦程序运行结束, 对象就会销毁, 有时需要将对象的信息长久保存,就需要将对象输入到文件中。
( 例如系统升级,关闭服务器时将对象保存起来,升级完毕后再重新把数据还原回来.)
📌对象的序列化和反序列化:
○ 把对象输入到文件的过程也称为对象的序列化.
○ 把对象从文件输入到程序的过程称为对象的反序列化, 反序列化时会生成一个新的对象, 所以反序列化也是创建对象的一种方式.
📌注意:
当一个类的对象需要被序列化到文件时, 这个类必须要生成一个序列化编号。
○ 如果一个类需要被序列化到文件中, 那么这个类就需要实现Serializable接口, 实现后, 会自动的为该类生成一个序列化编号.
📌关于序列化编号的意义:
○ 编号是类的唯一标识,但是自动生成的编号在类信息改变后会重新为类生成一个编号。
○ 可以在类中显示的生成一个编号,这样类信息修改后,编号也不会改变。
📌常用类及基本方法:
- 对象的输出流: ObjectOutputStream
- 对象的输入流: ObjectInputStream
- 在ObjectInputStream中用readObject()方法可以直接读取一个对象。
- 在ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。
二. 生成序列化ID教程
📌 如何在IDEA中设置, 使可以在类中生成序列化ID ? ( 教程 )
📌 设置成功后, 当我们把鼠标移至类名处, 点击serialVersionUID即可生成编号
三. 代码实践与测试
① 我们首先创建一个学生类,需要将学生信息序列化到文件中,切记需要实现Serializable接口.
import java.io.Serializable;
//如果一个类需要被序列化到文件中,那么这个类就需要实现Serializable接口
public class Student implements Serializable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
② 进行序列化操作,将对象数据输出到文件中,使对象的信息可以做到持久化。
//对象输出 (对象的序列化)
Student student =new Student("小魏",20);//创建对象
FileOutputStream fileOutputStream = new FileOutputStream("E:/obj.txt");
ObjectOutput output = new ObjectOutputStream(fileOutputStream);
output.writeObject(student);
output.flush();
output.close();
③ 运行程序后发现, 对象信息保存在了文件obj.txt中(格式为乱码,但不影响最后反序列化输入结果)
④ 进行反序列化操作, 将之前保存在文件obj.txt的对象信息输入到程序中。
public static void main(String[] args) throws IOException, ClassNotFoundException {
//对象输出 (对象的序列化)
/*
Student student =new Student("小魏",20);//创建对象
FileOutputStream fileOutputStream = new FileOutputStream("E:/obj.txt");
ObjectOutput output = new ObjectOutputStream(fileOutputStream);
output.writeObject(student);
output.flush();
output.close();
*/
//对象输入 (对象的反序列化)
FileInputStream inputStream = new FileInputStream("E:/obj.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Student student = (Student) objectInputStream.readObject();//强制类型转换
System.out.println(student);//打印对象信息
objectInputStream.close();//记得关闭流通道
}
☞ 运行结果: