提到序列化,很多选手脑袋冒出的第一个声音 —— “Parcelable和Serializable”。
其实Android项目中可以使用的序列化方式不止这两个,有一些你可能正在用,但是并不知道这种方式属于序列化。
一、什么是序列化
在日常生活中“序列化”并不是一个常见的词汇。对于这种看上去高大上的词语如果不能了解透彻,很容易成为你研究新神通的阻碍。知其然并知其所以然,才能一通百通,不让代码限制你的跳跃性思维。
1.定义:
百度百科:
序列化 (Serialization) 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
维基百科:
序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢撤消先状态的过程。
与序列化相反的过程又称为反序列化。
2.理解:
通俗的讲:
序列化就是你朋友把电脑拆了,你把拆了的电脑组装起来就是反序列化。而拆了的电脑可以扔到仓库储存,或者快递邮寄传输。
玄学着讲:
序列化就是把有形化为无形,从无形化为有形恢复本来面目就是反序列化。无形不灭。
序列化是一个有规则的变化过程,反序列化则是有同样但是相反的规则的变化过程。
3.图解


二、序列化的目的
了解一个技术设计出来的目的,能帮你在需要的时候做出更好的选择。比如当你选择用NestedScrollView还是ScrollView的时候,如果你知道NestedScrollView出现的目的是跟MD中的其他控件兼容,那在里面嵌套RecycleView的时候你就应该毫不犹豫的选择NestedScrollView。
- 以某种存储形式使自定义对象持久化;
- 将对象从一个地方传递到另一个地方。
- 使程序更具维护性。
通俗点讲:
一些情况下,对象是不能直接传输的,需要序列化。接收方反序列化得到原对象。
一些情况下,电脑是不方便直接邮寄的,需要拆了分开邮寄。收件人重新组装得到原电脑。
三、序列化的用途
用途的介绍是不可能介绍全的,了解了定义和目的,用在什么地方全凭你的喜好。就好像你知道了邮寄电脑可以把它拆了,你就应该知道网购自行车也可以买被拆散的那种。这也就是我前文中提到的“新神通”。
- 经由电信线路传输数据的方法(通信)。
- 远程程序调用的方法,例如在SOAP中。
- 检测随时间数据变动的方法。
- 存储数据的方法(在数据库或硬盘)。
- 从服务器获取数据。
- Activity之间传递数据。
等等...
思维再发散一点,你能想到更多,下面是维基百科中的例子:
商用软件的出版商通常会将应用软件的序列化格式,当作商业秘密,以阻碍竞争对手生产可兼容的产品;有些会蓄意地混淆,或甚至将序列化数据作加密处理。
四、序列化格式
序列化需要规则,如果你不知道序列化的规则,也就不能反序列化。传递过来的序列化便没有意义了。到这里你也能知道序列化和加密的区别了,加密是不一定需要解密的。
序列化格式多种多样,甚至可以自定义。然而,互通可用性的要求应用程序能够理解彼此的序列化格式。
维基百科中有如下介绍:
20世纪80年代初的施乐网络系统快递技术影响了第一个广泛采用的标准。Sun Microsystems在1987年发布了外部数据表示法(XDR)。90年代后期开始推动标准序列化的协议:XML(可扩展标记语言)应用于产生人类可读的文字编码。数据以这样的编码使存续的对象能有效用,无论相对于人是否可阅读与理解,或与编程语言无关地传递给其它信息系统。它缺点是失去了扎实的编码字节流,但截至当前技术上所提供大量的存储和传输容量,使得文件大小的考量,已不同于早期计算机科学的重视程度。二进制XML被提议作为一种妥协方式,它不能被纯文本编辑器读取,但比一般XML更为扎实。在二十一世纪的Ajax技术网页中,XML经常应用于结构化数据在客端和伺服端之间的异步传输。相较于XML,JSON是一种轻量级的纯文字替代,也常用于网页应用中的客端-伺服端通信。JSON肇基于JavaScript语法所派生,但也广为其它编程语言所支持。与JSON类似的另一个替代方案是YAML,它包含加强序列化的功能,更“人性化”而且更扎实。这些功能包括标记数据类型,支持非层次结构式数据结构,缩进结构化数据的选项以及多种形式的标量数据引用的概念。
五、Android项目中可以使用的序列化方式不止Parcelable和Serializable
呼应标题,现在你应该知道为什么不止两种方式了。序列化是一种技术,不仅仅一两种方法。只要满足定义,都可以被称之为序列化。然后你便能想到:
- json也是一种序列化。网络请求用到那么多。
- 远古时代的xml也是序列化。记不记得曾经很火的博客主题“Android XML解析”?
等等...
六、排查项目
了解了序列化的定义、目的,反观我们自己的项目。
- 有些bean类又实现了Serializable,又用json解析构建,真的有必要吗?
- 不同平台之间json传递数据,需要考虑平台特性吗?
- Activity之间传递对象只能用Serializable吗?json行不行?
等等...
最后,希望这篇文章能帮助各位选手在日常工作中和新神通的研发中能更合理更擅长的使用序列化和反序列化。
如果文章中您发现了什么错误,有什么补充,欢迎留言探讨。朋友的QQ群:511276976
还有,打两个广告,自己的项目:
1、【拇指先生】https://github.com/Reone/Mrthumb 关于视频缩略图
2、【KVStorage】https://github.com/Reone/KVStorage 关于key-value形式使用数据库