java序列化与反序列化一、什么是序列化?序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是一种将Java对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回Java对象原有的状态。序列化的思想是“冻结”对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后“解冻”状态,重新获得可用的Java对象。所有这些事情的发生有点像是魔术,这要归功于ObjectInputStream/ObjectOutputStream类、完全保真的元数据,以及程序员愿意用Serializable标识接口标记他们的类,从而“参与”这个过程。把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。二、为什么要序列化?什么情况下需要序列化?当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送,接收方则需要把字节序列再恢复为对象。对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。序列化能将对象转成如XML/Bit流,方便对象的磁盘存储、网络传输(webService,RMI)。对象的寿命常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复以延续其状态。如何做到程序终止后对象继续存在?如何将对象在网络上传输?三、相关接口和类(1)Serializable接口和Externalizable接口(2)ObjectOutput接口:它继承DataOutput接口并且支持对象的序列化,其内的writeObject()方法实现存储一个对象。(3)ObjectOutputStream类:它继承OutputStream类并且实现ObjectOutput接口。利用该类来实现将对象存储(调用ObjectOutput接口中的writeObject()方法)。(4)ObjectInput接口:它继承DataInput接口并且支持对象的序列化,其内的readObject()方法实现读取一个对象。(5)ObjectInputStream类:它继承InputStream类并且实现ObjectInput接口。利用该类来实现将对象存储(调用ObjectInput接口中的readObject()方法)。四、怎么实现序列化?要被序列化的类必须实现Serializable接口或者Externalizable接口之一。实现Serializable接口,不需要实现任何方法,只是一个标记接口。.;;lassPersonimplementsSerializable{ /** *serialversionid */ privatestaticfinallongserialVersionUID=-2858407989098901728L; publicPerson(Stringname,intage){ =name; =age; } privateStringname; privateintage; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ =age; } publicStringtoString(){ return"[Person:name="+name+"age="+age+"]"; } }()方法,将对象保存到磁盘文件,文件后缀名可以任意起。()方法,将对象反序列化为原始对象。如果同时序列化多个对象到一个序列化文件时,读取的顺序应与写入的顺序保持一致。.;;
java序列化与反序列化 来自淘豆网www.taodocs.com转载请标明出处.