序列化和反序列化的学习

271 阅读4分钟

写在前面


序列化和反序列化,这一听很熟悉,经常在开发过程中听到过这个词语,但是当我们细细看看以下几个问题,能回答上来几个。很熟悉的词语,但是一问,我依旧还是懵逼。

看看这几个问题
  1. 序列化的定义,什么是序列化,什么是反序列化

  2. 序列化的好处是啥,为啥要序列化和反序列化

  3. Java中是如何实现序列化和反序列化的

序列化和反序列化的定义

序列化: java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;


反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。


总结一下:序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。

为啥序列化和反序列化

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。

当两个进程需要传递对象的时候,序列化和反序列化就发挥作用了,发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

序列和反序列的好处


1.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中

2.在网络上传送对象的字节序列。


序列化和反序列化的应用


在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

java中是如何序列化和反序列化的java中相关的API


1.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。


2.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。



只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。(我猜这个就是为啥大多数都是直接实现了Serializable接口的原因吧,可以使用默认的序列化方式)

看、看、看


假定一个User类,它的对象需要序列化,可以有如下三种方法:


1.若User类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化


ObjectOutputStream采用默认的序列化方式,对User对象的非transient的实例变量进行序列化。 

ObjcetInputStream采用默认的反序列化方式,对对User对象的非transient的实例变量进行反序列化。


2.若User类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。


ObjectOutputStream调用User对象的writeObject(ObjectOutputStream out)的方法进行序列化。 

ObjectInputStream会调用User对象的readObject(ObjectInputStream in)的方法进行反序列化。


3.若User类实现了Externalizable接口,且User类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。


ObjectOutputStream调用User对象的writeExternal(ObjectOutput out))的方法进行序列化。 

ObjectInputStream会调用User对象的readExternal(ObjectInput in)的方法进行反序列化。

代码演示序列化和反序列化实现Serializable


image.png

测试类Test1.java

image.png

在本地D盘看生成了一个文件:

image.png


换成实现Externalizable

User类的代码:

image.png

测试Test1.java

image.png

在本地D盘看生成了一个文件:

image.png

加入51码农,让我们一起组队学习技术。www.51manonong.com