序列化流
流 除了可以对文件进行操作,也可以对对象进行操作,这就要说到序列化与反序列化。
场景说明:
1.什么是序列化,为什么要序列化
对象信息 -> 文本中
文本中 -> 对象
因为可能要进行服务器维护,服务器中的对象需要进行记录
启动服务器的时候,对象可以还原
2.如何进行对象序列化
前提:对象类要实现 java.io.Serializable 接口
具备了可以支持序列化和反序列化的操作
3.进行序列化操作方法
(1)流对象
ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream
(2)流对象负责将你的对象进行序列化到指定的文本文件中
void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream
import java.io.Serializable; // 创建 Student 类(实现了 Serializable 接口) public class Student implements Serializable { private String name; private int age; private static final long serialVersionUID = 38L; // // 提供 getter 和 setter 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 提供无参、有参构造方法 public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } // 重写 toString()方法 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; // 序列化测试 public class ObjectStreamTest01 { public static void main(String[] args) throws IOException {
// 创建流对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day10\\object.txt"));
// 实例化 3 个对象 Student student = new Student("zs", 20); Student student2 = new Student("ls", 20); Student student3 = new Student("ww", 20);
// 将对象进行序列化到指定的文本文件中(day10\\object.txt) oos.writeObject(student); oos.writeObject(student2); oos.writeObject(student3);
oos.close(); } }
// 执行代码后,在 day10\\object.txt 文件中生成了一些乱码:(看不懂没关系)
-----------------------------------------------
反序列化
将文件中的对象的字节序列,还原回堆内存,形成对象
构造方法
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream
成员方法
Object readObject() 从 ObjectInputStream 读取对象
import java.io.EOFException; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; // 反序列化测试:文本 -> 对象 public class ObjectStreamTest02 { public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10\\object.txt")); /* Object o = ois.readObject(); System.out.println(o); // Student{name='zs', age=20} Object o2 = ois.readObject(); System.out.println(o2); // Student{name='ls', age=20} Object o3 = ois.readObject(); System.out.println(o3); // Student{name='ww', age=20} Object o4 = ois.readObject(); System.out.println(o4); // Exception in thread "main" java.io.EOFException */ // 假如不知有多少个对象要反序列化,则容易出现 EOFException 异常 // 所以用循环来解决,捕捉到异常后跳出循环 while (true){ try { Object o = ois.readObject(); System.out.println(o); }catch (EOFException e){ break; } } // 判断类型由Student提升上去的,再进行强转就不会出现类型转换异常 /* if (o instanceof Student){ Student student = (Student) o; System.out.println(student); } */ ois.close(); } }
// 控制台输出结果如下:
Student{name='zs', age=20}
Student{name='ls', age=20}
Student{name='ww', age=20}