【Spring】1. Java对象序列化和反序列化

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修饰的属性,是不会被序列化的。

posted @ 2023-01-05 16:05  随风落木  阅读(32)  评论(0)    收藏  举报  来源