小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
文章目录
介绍
对象序列化和反序列化。ObjectOutputStream
将对象信息按固定格式转成字节序列输出。ObjectInputStream
将读取序列化字节值,恢复(重建)对象。
使用
创建对象
ObjectOutputStream out = new ObjectOutputStream(相接的流)
方法
ObjectOutputStream 特有的成员方法
writeObject(Object obj)//序列化输出
ObjectInputStream 特有的成员方法
readObject()//反序列化恢复对象
栗子1:序列化
创建 Student 类
class Student {
private int id;
private String name;
private String gender;
private int age;
public Student() {
}
public Student(int id, String name, String gender, int age) {
this.id = id;
this.name = name;
this.gender = gender;
this.age = age;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return
"\n" + "学号" + id +
"\n" + "姓名" + name +
"\n" + "性别" + gender +
"\n" + "年龄" + age;
}
}
Main
public class Main {
public static void main(String[] args) throws Exception {
Student s = new Student(2, "Errol", "男", 24);
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("d:/abc/stu"));
out.writeObject(s);
out.close();
}
}
这样直接写是会报错,不能序列化。
我们需要让 Student 类实现 Serializable。修改 Student 类如下:
/*
* Serializable是个空接口
* 标识接口
* 用来标识 Student 类型对象可以 被序列化
*/
class Student implements Serializable {
......
}
Tips:如果 Student 里还有其他类,这个类也要实现 Serializable 接口
运行程序会在 D 盘 abc 文件夹下生成 stu 文件,查看内容:
栗子2:读取
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("d:/abc/stu"));
Student s = (Student)in.readObject();
in.close();
System.out.println(s);
运行程序,输出:
序列化头部数据
新建 ObjectOutputStream 时,会自动先输出4个头部字节值。我们可以测试下,栗子 1 中,注释掉 out.writeObject(s);
在运行程序,查看输出的 stu 文件
这是为了方便读取,如果是这 4 个字节值,则后边是序列化的数据,如果不是这 4 个字节值,后面的就不是对象序列化数据了。
新建 ObjectInputStream 时,会自动先读取 4 个头部字节值,来确认后边的数据是否是对象序列化数据。如果不是会出现异常 invalid stream header
不序列化的成员
1、static 静态属于类,不随对象序列化输出
2、transient 临时,只在程序运行时,在内存中存在,不会被序列化持久地保存
修改 Student 类中变量为以下
private int id;
private String name;
private static String gender;
private transient int age;
执行栗子1 后查看 stu 内容
执行栗子2 读取数据