1. 概念
1.1 序列化
- 将数据结构或对象转换成二进制字节流的过程
1.2 反序列化
- 序列化的反过程
- 把二进制字节流恢复为数据结构或对象的过程
1.3 序列化的目的:
通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。
2. 为什么要进行序列化?(应用场景)
- 对象持久化
- 网络传输(java对象)
- 实现分布式对象
2.1 对象持久化
将内存中的对象状态保存到文件或者数据库中。
2.2 网络传输
Java对象需要序列化(成字节流),才能在网络上传输(数据格式为二进制)
网络传输的数据都必须是二进制的,但是在Java中,数据的存储形式都是对象,是没有办法直接在网络中进行传输的,所以就需要对Java的对象进行序列化,并且要求这个序列化是可逆的,也就是说要可以进行反序列化,否则接收方不能知道你传递的是何种信息。
2.3 实现分布式对象
如RMI(远程方法调用)要利用对象序列化运行在远程主机上的服务,就像在本地机器上运行对象时一样。
3. 序列化是如何实现的?
3.1 Java原生序列化
需要被实例化的类实现Serializable接口;
具体实现:
- 序列化:
(1)ObjectOutputStream.writeObject(Object obj) 方法;
(2)Externalizable:他是Serializable接口的子类,有时我们不希望序列化那么多,可以使用这个接口,这个接口的writeExternal()和readExternal()方法可以指定序列化哪些属性。
- 反序列化:
ObjectInputStream.readObject(Object obj) 方法
缺点:效率较低,序列化后的流数据比较大
不推荐使用,原因
- 不支持跨语言调用 : 如果调用的是其他语言开发的服务的时候就不支持了。
- 性能差 :相比于其他序列化框架性能更低,主要原因是序列化之后的字节数组体积较大,导致传输成本加大。
3.2 使用第三方的序列化方式(推荐)
- Json 序列化
- FastJson 序列化 (FastJson2)
- Protobuff 序列化
- Kryo
- ProtoStuff
- hession
- ...
4. 注意点
1、transient修饰的属性,是不会被序列化的;
2、static修饰的属性,是不会被序列化的。