IO-对象实例化

来源:互联网 发布:java 高斯扩散模型 编辑:程序博客网 时间:2024/05/17 00:51

一,本章目标

①掌握对象序列化的作用

②掌握Serializable接口的作用

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

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

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

⑥掌握transient关键字的作用

⑦可以序列化一组对象





二,具体内容

2.1  什么叫对象序列化?

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

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

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

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

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

ObjectOutputStream:

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

反序列化:ObjectInputStream:


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

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


2.3 Externalizable接口

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

次接口继承了Serializable接口。

方法:

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

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

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

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

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


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

2.4transient关键字

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

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



2.5序列化一组对象。

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

问题:保存的数据有限,所以为了解决这个问题,java引入了类集框架解决了数组的存储限制问题。





三,总结


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

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

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

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

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




原创粉丝点击