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 第一章
- 2015_4_29 序列化小结
- C#序列化小结
- Java对象序列化小结
- Java序列化Serializable小结
- Java对象序列化小结
- C# XML序列化小结
- 序列化的serialVersionUID小结.
- 序列小结
- 序列化与反序列化小结
- java序列化—Serializable 小结
- Java String的序列化小结
- Java对象序列化知识小结
- 【序列化】小结,逐步完善中
- Android中Parcelable序列化小结
- ORACLE 序列sequence小结
- Oracle序列小结
- 转义序列小结
- java序列化与反序列化小结
- jQuery异步提交form表单
- 欢迎使用CSDN-markdown编辑器
- C++析构函数为什么要为虚函数
- 系统状态监测--- 磁盘空间使用情况
- Thinking In Java笔记(第四章 控制执行流程)
- 2015_4_29 序列化小结
- 数据结构 - 数组、矩阵、广义表存储
- mybatis之foreach
- Could not resolve hostname 。。。。。。: Name or service not known
- Android个人笔记 - Google Android揭秘_第一章
- 蚁群系统解决TSP问题
- 【C/C++学院】0801-重定向以及文件扫描/二进制加密解密/简单加密/按照密码加密/动态库与静态库
- Unity优化
- Android之 系统启动流程