对象序列化流
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
要实现序列化和反序列化就要使用对象序列化流和对象反序列化流: 1、对象序列化流:ObjectOutputStream 2、对象反序列化流:ObjectInputStream
对象序列化流:ObjectOutputStream类
该类在java.io包下。该类继承了OutputStream,即该类是字节输出流。该类是具体的类,实现了两个接口ObjectOutput、ObjectStreamConstants
该类将Java对象的原始数据类型和图形写入字节输出流OutputStream。可以使用ObjectInputStream读取(重构)对象
该类可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
该类的构造方法如下
构造方法 | 作用 |
---|---|
ObjectOutputStream(OutputStream out) | 创建一个写入指定OutputStream的ObjectOutputStream |
该类的方法如下
方法 | 作用 |
---|---|
writeObject(Object obj) | 将指定的对象写入ObjectOutputStream。该方法可以实现对象序列化 |
注意 1、一个对象要想被序列化,该对象所属的类必须实现Serializable接口 2、Serializable是一个标记接口,实现该接口,不需要重写任何方法
对象序列化流的练习
xxxxxxxxxx
package ch20;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
//这节课简单理解为把类里面的数据写入一个文件里面,然后我们去文件里面看的是乱码的数据。下节课会处理这个乱码问题
//对象序列化流是把学生类的数据序列到文件中,反序列化流可以把字节序列读成我们看的懂的。反序列化流在下节课学习
public class a_10_1测试 {
public static void main(String[] args) throws IOException {
//通过构造方法创建对象序列化流的对象 ObjectOutputStream(OutputStream out)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\oos.txt"));
//要序列化一个对象首先要有一个对象,即要新建一个学生类,再在下面创建对象
a_10_2Student s = new a_10_2Student("张三",18);
//writeObject(Object obj) 将指定的对象写入ObjectOutputStream。该方法可以实现对象序列化
oos.writeObject(s);
//凡是使用流,就必须释放资源
oos.close();
//运行发现控制台报错NotSerializableException。该报错的意思是抛出一个实例需要一个Serializable接口,否则该类不能任何状态序列化或反序列化
//解决:让学生类实现Serializable接口,即去学生类写implements Serializable,别漏了还需要导包
//Serializable接口仅仅是标识接口也叫标记接口,不需要我们重写该接口里面的方法
//运行发现虽然不报错,但是对于文件显示的是乱码。乱码原因:把整个对象按照字节序列写进文件的
//如何是我们读懂里面的内容呢,需要使用反序列化流,就可以把对象读取出来
//反序列化流在下节课学习
}
}
xxxxxxxxxx
package ch20;
import java.io.Serializable;
public class a_10_2Student implements Serializable {//Serializable接口报红线,因为该接口在java.io包下,所以需要导包才能使用
//成员变量
private String name;
private int age;
//无参构造方法
public a_10_2Student() {
}
//带参构造方法
public a_10_2Student(String name, int age) {
this.name = name;
this.age = age;
}
//成员变量对应的get/set方法
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;
}
}