序列化和反序列化

定义

序列化:把Java对象转换为字节序列的过程

反序列化:把自己序列恢复为Java对象的过程

使用原因

  1. 便于存储:可以吧对象的字节序列永久保存到硬盘上(如果放内存中,则会消失)
  2. 便于传输:在网络上传送对象的字节序列
  3. 附加:将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中重建对象

好处

由于整个过程都是在Java虚拟机(JVM)上运行的,独立于电脑的操作系统,所以,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象,在内存中重建对象

总结

核心作用就是对象状态的保存和重建。(整个过程的核心点:字节流中的所保存的对象状态及描述信息

实现过程

条件:被序列化的对象的类必须实现接口 java.io.Serializable

JDK中序列化和反序列化的API

①java.io.ObjectInputStream:对象输入流。

该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。

②java.io.ObjectOutputStream:对象输出流。

该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。

序列化

主要有两步骤:

  1. 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流
  2. 通过ObjectOutputStream对象输入流的writeObject()方法写对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;

class Pet implements Serializable {

}

public class Person implements Serializable {
private String name;
private int age;
private Pet pet;
}

class Test {
public static void main(String[] args) throws IOException {
Person person = new Person();
File file = new File("text.txt"); //对象序列化保存的位置
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); //需要使用ObjectOutputStream对象
objectOutputStream.writeObject(person); //使用writeObject()方法将对象序列化
}
}

注意!!!:如对象中有非基本类型属性,则该属性的类也需要实现Serializable接口

注意!!!:如对象中有非基本类型属性,则该属性的类也需要实现Serializable接口

注意!!!:如对象中有非基本类型属性,则该属性的类也需要实现Serializable接口

反序列化

主要有两步骤:

  1. 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流
  2. 通过ObjectOutputStream对象输入流的readObject()方法读取对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com;

import java.io.*;

class Pet implements Serializable {

}

public class Person implements Serializable {
private String name;
private int age;
private Pet pet;
}

class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = null;
File file = new File("text.txt"); //被反序列化的对象的存储位置
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); //需要用到ObjectInputStream对象
person = (Person) objectInputStream.readObject(); //反序列化对象的字节码
System.out.println(person);
}
}
Contents
  1. 1. 定义
    1. 1.1. 使用原因
    2. 1.2. 好处
    3. 1.3. 总结
  2. 2. 实现过程
    1. 2.1. JDK中序列化和反序列化的API
    2. 2.2. 序列化
    3. 2.3. 反序列化
|