序列化流

流 除了可以对文件进行操作,也可以对对象进行操作,这就要说到序列化与反序列化。

场景说明:

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}

 

posted @ 2022-05-26 22:19  鹿先森JIAN  阅读(76)  评论(0编辑  收藏  举报