2015_4_29 序列化小结

来源:互联网 发布:linux touch 多个文件 编辑:程序博客网 时间:2024/05/21 02:52

2015年4月19日星期日 序列化小结

 

1 What ? 什么是序列化

序列化是将数据经过一定的算法然后写入到对象流中,可以保存在本地文件,也可以通过网络进行传输,java实现中,都需要实现Serializable 接口,且都会有

private static final longserialVersionUID=xxxxxx;

属性,其具体值既可以自己指定,也可以依靠各个版本ide提供的自动计算得到。

 

 

2 Why ?为什么要序列化

A 存储之用,使用固定长度记录格式是一个不错的选择,但是在面向对象过程中创建的对象很少具有相同类型;

B 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性,即serialVersionUID。一般这个值是由自己定义,服务器和客户端都应具有相同的值。如若两者不同,则会认为版本不一致导致不兼容;

C 为了反序列之用,易于JVM之间移植。数据通过网络传输到对端,对选需要对数据进行反序列,注意,需要用相同的序列化反序列算法才可以,不然会导致反序列失败或者错误,有很多序列化算法;

D 多个对象内拥有同一个对象,此时,该对象在这些对象中存储的是序列号(详见java核心卷2 流与文件 1.5 P36),此时序列化用序列号代替了内存地址,所它允许将对象集合从一台机器传送到另一台机器;

E 深拷贝,先写入到一个流中,才读取,灵活,但速度慢

F 套接字网络传输对象、保存在数据库或者文件、或者RMI传输对象

 

3 How ? 序列化是怎么实现的

哪些需要被序列化:当存储一个对象时,这个对象所属的类也必须存储,包括

A 类名

B 序列化唯一ID,它是数据域类型和方法签名的指纹

C 描述序列化方法的标志集

D 对数据域的描述

指纹是指对类,超类,接口,域类型和方法签名按照规范方式排序,按照散列算法(SHA)应用于这些数据而获得的

 

我们再来看看Serializable 接口,发现其什么也没有,那它是怎么实现的呢?

 

我们来看看writeObject方法代码:


只有实现了Serializable接口,writeObject方法才会去真正将数据写入到数据流中。

 

4 注意点:

并非所有所有域都可以序列化:被static 或者transient 修饰的是不需要序列化的,原因如下:

A static 由于是存在一个副本,难以维护,但如果是staticfinal 时,这时候是一个常量,是可以被序列化的,如serialVersionUID

B 有些数据只具有本地意义,不需要传递,节省带宽,所以有了transient修饰符

 

参考:

1 http://zhidao.baidu.com/question/304399468.html

2 http://diaoge.iteye.com/blog/162477

3 java核心卷2 第一章

0 0
原创粉丝点击