序列化、反序列化到底是什么?
2016-03-30 10:12
197 查看
一、序列化、反序列化到底是什么?
(1) 名词解释
对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。对象的反序列化:把字节序列恢复为Java对象的过程。
(2) 序列化详细解释
对象的序列化涉及三个点关键点:Java对象、字节序列、存储。1. Java对象的组成?
Java对象包含变量与方法。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。
2. 什么是字符序列?
字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个信息单位。数学上,序列是被排成一列的对象(或事件)。
《字符-维基百科》,《序列-维基百科》说白了就是连续排列的多个字符的集合。类似于1A165613246546
3. 存储
字符序列需要保存到一个地方,可以是硬盘也可以是内存。
简单说法是:序列化把当前对象信息保存下来。反序列化刚好相反的操作。
二、Java对象与Java对象序列化的区别?
Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象,在现有Java对象的机制下都不可能完成。与Java对象不同的是,如果对Java对象执行序列化操作,因为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。
三、为什么要使用序列化、反序列化?
根据以上对序列化、反序列化的理解,这个疑问可以翻译成,为什么需要把对象信息保存到存储媒介中并之后读取出来?因为二中的解释,开发中有在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象的需求。
四、当对一个对象实现序列化时,究竟发生了什么?
在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
java 代码
Foo myFoo = new Foo();
myFoo .setWidth(37);
myFoo.setHeight(70);
当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。
java 代码
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myFoo);
五、Android中Serializable与Parcelable区别?
两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。Serializable不是当前关注的焦点,不过可以查看《Java序列化算法透析》这篇文章中实现一个简单的Serializable例子,查看序列化生成的IO文件,并且以16进制读取并一一解释每一个16进制数字的含义。
相关文章推荐
- Android三种实现定时器的方法
- 设置mysql密码
- 毛泽东时代为我国经济腾飞奠定了基础
- iOS开发-的socket开发基础
- Js经典实例收集
- 结对编程项目---四则运算(代码篇)
- JavaScript之深入理解闭包
- ORACLE 存储过程被锁,无法编译
- CFile处理(读取路径文件内容,保存在表里面)
- Mysql 5.6 源码编译安装
- 网页正文提取——Html2Article
- Unable to associate project with a runtime server in eclipse IDE
- c#代码中捕获源信息
- 【C/C++】任意大于1的整数分解成素数因子乘积的形式
- 值类型和引用类型,栈和堆的含义
- 如何运用记事本、编译器、cmd编译运行cs文件
- MailNoInfo is not mapped [ select o from MailNoInfo o where o.mailNo in(:mailNo)]
- html5-表单
- html5-表单
- 输入汉字或者英文位数较应