序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
- 序列化流
- 序列化和反序列化
- 如何实现序列化
- ObjectOutputStream
- ObjectInputStream
序列化流
- 什么是序列化?
- 如何实现序列化?
- 什么是反序列化?
- 需要了解的类 ObjectInputStream ObjectOutputStream
序列化和反序列化
Java 序列化是一种将对象转换为字节流的过程,以便可以将对象保存到磁盘上,将其传输到网络上,或者将其存储在内存中,以后再进行反序列化,将字节流重新转换为对象。
简单点说:Java提供了对象序列化的机制,用一个字节序列可以表示一个对象,字节序列中包含了该对象的数据,对象的类型和对象中存储的属性等信息。并且这个字节序列可以被反序列化,即从文件中读取处理,重构为一个对象。
如何实现序列化
序列化在 Java 中是通过 java.io.Serializable 接口来实现的,该接口没有任何方法,只是一个标记接口,用于标识类可以被序列化。
一个类要想实现序列化,必须必须实现 Serializable接口,Serializable是一个标记接口,没有任何方法。若不实现此接口,而去序列化,则会抛出
NotSerializableException
异常。
如果类中的某些属性,不想序列化,则使用 transient 关键字,表示此属性是瞬态的,不需要序列化。
public class Student implements Serializable {
// 指定序列版本号 --- 若不指定,可能会出现 InvalidClassException 异常
private static final long serialVersionUID = 1L;
private String name;
private String sex;
private int age;
private transient String address; // address不被序列化
public Student() {
}
public Student(String name, String sex, int age, String address) {
this.name = name;
this.sex = sex;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
ObjectOutputStream
ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久储存。
构造方法:
public ObjectOutputStream(OutputStream out)
创建一个指定的OutputStream的ObjectOutputStream。
序列化例子(public final void writeObject (Object obj)
: 将指定的对象写出。):
// 1.创建学生类对象-为序列化准备数据
Student student = new Student("zhangsan", "man", 21, "huhehaote");
// 2.设置序列化位置
String optPath = "D:\\st.txt";
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(optPath));
// 3.开始序列化
oot.writeObject(student);
oot.close();
ObjectInputStream
ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
构造方法
public ObjectInputStream(InputStream in)
: 创建一个指定InputStream的ObjectInputStream。
反序列化例子:public final Object readObject ()
: 读取一个对象。
// 反序列化
String filePath = "D:\\st.txt";
// 1.创建对象
Student student = new Student();
// 2.ObjectInputStream对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filePath));
Student o = (Student)in.readObject();
System.out.println(student);
in.close();
注意上面的例子,为了简洁我都直接将异常抛出了,实际情况肯定使用try-cath啊,别被误导 👻