IO-对象序列化

一,本章目标

①掌握对象序列化的作用

②掌握Serializable接口的作用

③可以使用ObjectOutputStream进行对象序列化操作

④可以使用ObjectInputStream进行对象的反序列化操作

⑤整我Externalizable接口的作用及Serializable接口的实现区别

⑥掌握transient关键字的作用

⑦可以序列化一组对象





二,具体内容

2.1  什么叫对象序列化?

一个对象产生之后,实际上是在内存中为其开辟了一个存贮控件,方便存贮信息。

IO-对象序列化_第1张图片IO-对象序列化_第2张图片

一个类不能平白无故地被序列化。这个接口中没有任何一个方法,此接口表示一个标识接口,表示其具备了某种功能。实例如下:

IO-对象序列化_第3张图片

此类实现了Serializable接口,表示这个类可以被序列化了,变成二进制byte流。

IO-对象序列化_第4张图片

IO-对象序列化_第5张图片

但是在进行序列化和反序列化操作的时候,对于不同的jdk版本,实际上会出现版本的兼容问题。

IO-对象序列化_第6张图片

2.2  对象的序列化和反序列化

ObjectOutputStream:

IO-对象序列化_第7张图片

IO-对象序列化_第8张图片

到底序列化了哪些东西?所有的对象拥有各自的属性值,但是所有的方法都是公共的,所以序列化对象的时候实际上序列化就是属性。

反序列化:ObjectInputStream:

IO-对象序列化_第9张图片

IO-对象序列化_第10张图片

问题:如果一个类实现了Serializable接口,则肯定此类可以被序列化,那么也就意味多了一项功能,可以被序列化,那么是不是所有类都实现此接口是不是更好?

因为JDK是不断升级的,现在Serializable接口还没有定义,如果以后有定义了呢?那么所有类都要改变。


2.3 Externalizable接口

使用此接口可以方便的序列化一个对象,但是在序列化操作中也提供了另外一种序列化机制---Externalizable。

IO-对象序列化_第11张图片

次接口继承了Serializable接口。

方法:

①写入:void writeExternal(ObjectOutput out)throws IOException

②读取:void readExternal(ObjectInput in)throws IOException,ClassNotFoundException

利用此接口修改之前的程序:

IO-对象序列化_第12张图片

以上的程序没有任何问题,但是它出现了一个错误,在使用Exteterlizable的接口的时候需要在被序列化的类中定义一个无参构造,因为此接口在镜像反序列化的时候,

会先使用类中的无参构造方法为其实例化,之后再将读取的内容分别设置到属性之中。


在开发中,使用Serializable接口是使用得最多的

IO-对象序列化_第13张图片

2.4transient关键字

在序列化操作的时候,如果某个属性不希望被序列化下来,则可以直接使用这个关键字声明。

transient+Serializable接口可以完全取代Externalizable接口的功能。



2.5序列化一组对象。

如果想要保存多个对象,最好使用对象数组来完成。

IO-对象序列化_第14张图片
IO-对象序列化_第15张图片
问题:保存的数据有限,所以为了解决这个问题,java引入了类集框架解决了数组的存储限制问题。





三,总结


1.对象的序列化作用,对象序列化并不一定向文件保存,也有可能面向于其他输出

2.被序列化对象的类必须实现Serializable接口,如果某个属性那个被序列化,则可以使勇transient关键字声明

3.ObjectOutputStream序列化对象,ObjectInputStream 对象

4.Externalizable接口:实现手工序列化对象

5.使用序列化对象保存一组对像的时候要使用对象数组的形式操作




你可能感兴趣的:(java)