序列化的作用就是通过将对象写进文件中,来永久化的保存对象中的数据结构,这样可以防止它在在消耗内存中的资源。
序列化:通过将对象转换成字节码序列
反序列:就是序列化的逆操作,就是将字节码文件转换成对象
使用序列化和反序列化,要用到两个实现类分别是ObjectInputStream,ObjectOutputStre这两类是继承InputStream,OutputStream这两个抽象类,下面是这两个实现类的构造方法
它们所接受的参数是InputStream,OutputStream的实现类,可以是Buffered,也可以是FileInputstream,FileOutputStream(这两个是FilterInputStream,FileOutputStream的实现类),
那么如何去序列化对象呢,首先我们需要去定义一个对象,如图
public class Student {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
public Student() {
}
public Student(String id, String name) {
this.id = id;
this.name = name;
}
}
当然这个类建立之后并不能,对它进行序列化,还需要实现一个接口Serializable,这是一个标记,意思是这个类的对象可以序列化,我们看一看这个接口里实现了什么,如图
这里面什么都没有
那具体的实现该怎么做,我们发现,序列化和反序列化有两个方法分别是writeObject(),readObject(),如图
看不懂这些也能序列化对象
准备条件之后,下图是具体操作
import java.io.*;
public class Test {
public static void main(String[] args) {
// FileInputStream fis=null;
FileOutputStream fos=null;
try {
// fis=new FileInputStream("student.txt");
fos=new FileOutputStream("student.txt");
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
// ObjectInputStream ois=null;
ObjectOutputStream oos=null;
try {
// ois=new ObjectInputStream(fis);
oos=new ObjectOutputStream(fos);
Student st=new Student("1212","王小胖");
oos.writeObject(st);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
下面是对象转换成了字节码,能看出来这个对象的id是1212,名字是王小胖
进行完序列化,下面是反序列化
如图
import java.io.*;
public class Test {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("student.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(fis);
Student st=(Student)ois.readObject();
System.out.println(st);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
下面是控制台输出
如图
这和我们写入的对象完全一致,以上就是对象序列化和反序列化的基本操作了