一、序列化和反序列化

序列化:将数据结构或对象转换成二进制字节流的过程

反序列化:将在序列化过程中产生的二进制字节流转换成数据结构或对象的过程

 

常见场景:

1、网络传输时,对象需要先被序列化,接收到后再进行反序列化

2、将对象持久化到磁盘、文件时需要先进行序列化,从磁盘或者文件读取对象时需要进行反序列化

3、将对象存储到数据库如redis之前需要用到序列化,将对象从数据库中读取出来需要反序列化

4、将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化

5、实现对象的深拷贝

 

序列化属于 TCP/IP 协议的应用层,OSI 七层协议模型中的表示层。

 

二、实现序列化的方法

实现java.io.Serializable接口即可。对于不想进行序列化的变量,可以使用 transient 关键字修饰。

使用序列化和反序列化实现深拷贝的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class DeepCopyUtil {
    public static <T> T deepCopy(T obj) throws Exception {
        // 创建字节输出流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
 
        // 将对象写入字节输出流中
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.flush();
        oos.close();
 
        // 从字节数组中读取对象
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        T newObj = (T) ois.readObject();
        ois.close();
 
        return newObj;
    }
}

  

具体步骤如下:

  1. 将要拷贝的对象进行序列化,得到一个字节流。

  2. 将字节流反序列化成一个新的对象,即完成了对象的拷贝。