①掌握对象序列化的作用
②掌握Serializable接口的作用
③可以使用ObjectOutputStream进行对象序列化操作
④可以使用ObjectInputStream进行对象的反序列化操作
⑤整我Externalizable接口的作用及Serializable接口的实现区别
⑥掌握transient关键字的作用
⑦可以序列化一组对象
一个对象产生之后,实际上是在内存中为其开辟了一个存贮控件,方便存贮信息。
一个类不能平白无故地被序列化。这个接口中没有任何一个方法,此接口表示一个标识接口,表示其具备了某种功能。实例如下:
此类实现了Serializable接口,表示这个类可以被序列化了,变成二进制byte流。
但是在进行序列化和反序列化操作的时候,对于不同的jdk版本,实际上会出现版本的兼容问题。
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接口是使用得最多的
在序列化操作的时候,如果某个属性不希望被序列化下来,则可以直接使用这个关键字声明。
transient+Serializable接口可以完全取代Externalizable接口的功能。
1.对象的序列化作用,对象序列化并不一定向文件保存,也有可能面向于其他输出
2.被序列化对象的类必须实现Serializable接口,如果某个属性那个被序列化,则可以使勇transient关键字声明
3.ObjectOutputStream序列化对象,ObjectInputStream 对象
4.Externalizable接口:实现手工序列化对象
5.使用序列化对象保存一组对像的时候要使用对象数组的形式操作