本博客致力于成为学习工作的参考文档
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。
序列化的应用:
1.把的内存中的对象状态保存到一个文件中或者数据库中时候;
2.将对象进行传输
3.可以通过网络传输将对象传输
4.跨系统,甚至可以在windows操作系统创建一个对象,然后在linux系统将其重装。
按照Java的定义,数据区分为5个部分:
1.栈
2.堆
3.方法区
4.本地方法栈
5.程序计数器
其中,对象是保存在堆中的,对象的状态(实例变量)是保存在栈中。
我们有没有想过,在程序退出前,将对象已经其状态保存下来,下次启动程序的时候可以读取出来呢?
要将类进行持久化处理,就要实现Serializable接口。而这个Serializable接口,是没有任何方法或者字段,只是提供接口标记。
public interface Serializable {
}
举个简单例子:
import java.io.Serializable;
public class Animal implements Serializable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Animal animal=new Animal();
animal.setName("狗狗");
FileOutputStream fs=new FileOutputStream("animal.txt");
ObjectOutputStream os=new ObjectOutputStream(fs);
os.writeObject(animal);
os.close();
FileInputStream fis=new FileInputStream("animal.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
Animal animal2=(Animal) ois.readObject();
System.out.println(animal2.getName());
ois.close();
}
}
运行结果:在控制台打印出“狗狗”
这个时候,我们可以认为,我们已经将Animal对象a nimal的状态给持久化保存下来。
如果Animal类不实现Serializable接口,运行时就会出现NotSerializableException的错误,只有实现了这个接口,Animal的对象才可能被序列化处理。
下面是将对象进行序列化处理的关键:
os.writeObject(animal);
对象的序列化是基于字节,要序列化一个对象,首先要创建一个FileOutputStream对象,并将其封装在ObjectOutputStream对象内,这时候,只要调用writeObject()方法即可进行序列化处理。