Java序列化机制的深入研究

1、Java序列化简介

序列化就是指对象通过写出描述自己状态的数值来记录自己的过程,即将对象表示成一系列有序字节,java提供了将对象写入流和从流中恢复对象的方法。对象能包含其它的对象,而其它的对象又可以包含另外的对象。JAVA序列化能够自动的处理嵌套的对象。对于一个对象的简单域,writeObject()直接将其值写入流中。当遇到一个对象域时,writeObject()被再次调用,如果这个对象内嵌另一个对象,那么,writeObject() 又被调用,直到对象能被直接写入流为止。程序员所需要做的是将对象传入ObjectOutputStream writeObject() 方法,剩下的将有系统自动完成。

要实现序列化的类必须实现的java.io.Serializablejava.io. Externalizable接口,否则将产生一个NotSerializableException。该接口内部并没有任何方法,它只是一个"tagging interface" ,仅仅"tags"它自己的对象是一个特殊的类型。类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。Java"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了。

序列化图示

反序列化图示

在序列化的时候,writeObjectreadObject之间是有先后顺序的。readObject将最先writeobject read出来。用数据结构的术语来讲就称之为先进先出!

2、序列化的必要性及目的

Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。

Java序列化支持的两种主要特性:

Java RMI使本来存在于其他机器的对象可以表现出就象本地机器上的行为。

将消息发给远程对象时,需要通过对象序列化来传输参数和返回值.

Java序列化的目的:

支持运行在不同虚拟机上不同版本类之间的双向通讯;

定义允许JAVA类读取用相同类较老版本写入的数据流的机制;

定义允许JAVA类写用相同类较老版本读取的数据流的机制;

提供对持久性和RMI的序列化;

产生压缩流且运行良好以使RMI能序列化;

辨别写入的是否是本地流;

保持非版本化类的低负载;

3、序列化异常

    序列化对象期间可能抛出6种异常:

InvalidClassException  通常在重序列化流无法确定类型时或返回的类无法在取得对象的系统中表示时抛出此异常。异常也在恢复的类不声明为public时或没有public缺省(无变元)构造器时抛出。

NotSerializableException  通常由具体化对象(负责自身的重序列化)探测到输入流错误时抛出。错误通常由意外不变量值指示,或者表示要序列化的对象不可序列化。

StreamCorruptedException  在存放对象的头或控制数据无效时抛出。

OptionalDataException  流中应包含对象但实际只包含原型数据时抛出。

ClassNotFoundException  流的读取端找不到反序列化对象的类时抛出。

IOException  要读取或写入的对象发生与流有关的错误时抛出。

4、序列化一个对象

序列化一个对象,以及对序列化后的对象进行操作,需要遵循以下3点:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/cee6faff3fa0ab57ef1985581a2eb355.html