序列化,反序列化
序列化:
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
implements java.io.Serializable 或者 implements Java.io.EnSerializable
是Serializable的子集。
EnSerializable完全由自身控制序列化的方式,而父类Serializabe是按照默认的方式进行序列化。也就是:
//创建一个流对象
FileOutputStream out = new FileOutputStream( "C:\\temp\\test" );
//利用刚刚的流文件创建对象序列化流文件
//一般情况下都是这两个流
ObjectOutputStream serializer = new ObjectOutputStream(out);
//然后写入文件——》写入的是对象
serializer.writeObject(serializableObject);
***********************************************
反序列化:
//对象的读取也就一模一杨了
//创建一个流对象,比如文件输入流对象
FileInputStream in = new FileInputStream( “C:\temp\test” );
//用刚才的文件流,创建一个对象序列化输入流
ObjectInputStream deserializer = new ObjectInputStream(in);
//使用该流的输入函数,将文件中保存的对象读取到内存中,并创建相应对象。
Object deserializedObject = deserializer.readObject( );
但是并不是所有的类都需要进行序列化,还是看自己的实际情况,如果类中没有需要存储的对象,就不必进行对象那个系列化,那么就不得说下序列化的版本号了
serialVersionUID:
字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
如果继承了序列化类,却没有序列化版本号,还有警告,仅仅是警告,但是当你添加了一个属性,就不是这样了,每个序列化都会有对应的算法,所以你改变了类的属性或者方法,相当于人的基因改变了。
这样:只要这个文件 多一个空格,得到的UID就会截然不同的,可以保证在这么多类中,这个编号是唯一的。所以,添加了一个字段后,由于没有显指定 serialVersionUID,编译器又为我们生成了一个UID,当然和前面保存在文件中的那个不会一样了,于是就出现了2个序列化版本号不一致的错误。因此,只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。
还没有评论,来说两句吧...