一人一猫旅行记之浅析序列化及原理
在Activity跳转的时候,往往需要传递一个对象。不像String等基本类型,可以直接通过Intent的putExtra方法将数据加到Bundle中,换句话说对象并不是计算机可以识别的类型。
这样的话就涉及到了一个概念,序列化。
什么是序列化呢?序列化就是将对象转成可以存储或者传递的形式的过程,反序列化也是一个相反的过程,也就是将序列化后的数据转换成对象的一个过程。
Java与安卓分别提供了一种序列化的方法(Serializable和Parcelable)
那么二有什么区别呢?
1,Serializable会涉及到反射,产生大量的临时变量,这会引起系统频繁的GC
2,Serializable由JDK完成转换,而Parcelable则是自己完成序列化和反序列化,这就导致前者的效率要远低于后者。安卓之所以设计Parcelable的初衷就是Serializable效率过慢,为了在组件之间或者不同APP之间提高数据的传输速度,才设计了Parcelable。
3,如果当数据要存储在磁盘而不是内存中,Parcelable无法保证在外部环境发生变化时的连续性。
因此,在Android的组件或者APP之间传递数据,选择Parcelable。如果想要保存数据或者在网络上传输则选择Serializable。
二者在使用上也有很大的区别:
首先,对于Serializable来说使用非常简单,只需要让对象实现Serializable接口即可
我们可以看到Serializable这个接口是一个空的接口,这是怎么回事呢?
其实Serializable只是增加一个标识,在写入或者读取的时候会根据这个标识进行对应的处理,我们看到上面的注释涉及到几个类,咱们就看一下ObjectOutputStream中的源码。
private void writeObject0(Object obj, boolean unshared)throws IOException{<-省略部分代码->// ----- BEGIN android -----if (obj instanceof Class) {writeClass((Class) obj, unshared);} else if (obj instanceof ObjectStreamClass) {writeClassDesc((ObjectStreamClass) obj, unshared);// ----- END android -----} else if (obj instanceof String) {writeString((String) obj, unshared);} else if (cl.isArray()) {writeArray(obj, desc, unshared);} else if (obj instanceof Enum) {writeEnum((Enum) obj, desc, unshared);} else if (obj instanceof Serializable) {writeOrdinaryObject(obj, desc, unshared);} else {if (extendedDebugInfo) {throw new NotSerializableException(cl.getName() + "\n" + debugInfoStack.toString());} else {throw new NotSerializableException(cl.getName());}}} finally {depth--;bout.setBlockDataMode(oldMode);}}
从上面的代码应该可以明白,如果一个类加了Serializable标识,则会调用writeOrdinaryObject(obj, desc, unshared);
如果继续往下阅读代码的话,会走到如下的方法中:
private void writeSerialData(Object obj, ObjectStreamClass desc)throws IOException{ObjectStreamClass.ClassDataSlot[] slots = desc.getClassDataLayout();for (int i = 0; i < slots.length; i++) {ObjectStreamClass slotDesc = slots[i].desc;if (slotDesc.hasWriteObjectMethod()) {PutFieldImpl oldPut = curPut;curPut = null;SerialCallbackContext oldContext = curContext;if (extendedDebugInfo) {debugInfoStack.push("custom writeObject data (class \"" +slotDesc.getName() + "\")");}try {curContext = new SerialCallbackContext(obj, slotDesc);bout.setBlockDataMode(true);slotDesc.invokeWriteObject(obj, this);bout.setBlockDataMode(false);bout.writeByte(TC_ENDBLOCKDATA);} finally {curContext.setUsed();curContext = oldContext;if (extendedDebugInfo) {debugInfoStack.pop();}}curPut = oldPut;} else {defaultWriteFields(obj, slotDesc);}}}
看到这相信就知道为什么Serializable的效率会低了吧?
然后,对于Parcelable来说,它的使用相对比较复杂,因为它需要我们手动实现序列化与反序列化的方法。
我们创建一个Person.java,实现Parcelable,会提示增加两个方法和Parcelable的实现,其实分别对应Parcelable的三个过程(描述、序列化、反序列化)
@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(age);dest.writeString(name);}@Overridepublic int describeContents() {return 0;}
上面是要实现的两个方法,describeContents一般不需要处理,如果有一些需要特殊处理的数据的话则返回1。writeToParcel则是序列化的过程。
public static final Creator<Person> CREATOR = new Creator<Person>() {@Overridepublic Person createFromParcel(Parcel in) {return new Person(in);}@Overridepublic Person[] newArray(int size) {return new Person[size];}};
createFromParcel中返回一个Person对象,也就是反序列化的实现。
在前面咱们提到了序列化跟反序列化只是一个过程,所以无论Serializable还是Parcelable只是一种实现方式,我们还可以通过很多其他的方式来实现,比如JSON、XML,甚至用字符串也可以实现。
一人一猫旅行记之浅析序列化及原理相关推荐
- 小e的每日一画 之 飞毯旅行记 20071231
作者:小e,年龄:5岁9个月,打字:老豆 飞毯旅行记 有一天,阿魔对阿豆说:"咱们家那么穷,能买什么呢?" 阿豆说:"我也不知道,咱们找一个聪明的人去问问吧." ...
- 兔年伊始谈闲书:三体-乌合之众-百年孤独 和《猫城记》(随笔)
引言 " 各位读者,我们都兔年大吉,新春快乐. 我本想写一篇<公有云换帅转舵后的错误经验和正经歪念>,但刚过年就炮火味十足,觉得有失体面.所以就写了篇读书的散记杂记. 本文和 ...
- 读《猫城记》 | 人间失格
猫城记是老舍先生在1932年完成的一部科幻讽刺小说,故事是老舍先生梦到自己乘坐飞船到火星,结识到当地一种智慧生物--猫人,进而了解到猫人的社会现状,失格的经济.教育.政治,直到猫人国灭亡,返回地球. ...
- 软件需求分析之猫咪记单词
软件需求分析之猫咪记单词 一.软件设计目标 目前,所有学生都面临学习英语的问题.在大学生中学生对于手机的应用十分频繁,所以我们设置单词解屏,可以使学生拿起手机就学习英语,提高学习效率,应用零散时间. ...
- NABCD模型(猫咪记单词)
项目需求分析与建议-NABCD模型(猫咪记单词) N (Need 需求) 对于现在的学生,尤其是大学生来说,学习英语是一件非常重要的事.我们有四级六级托福雅思等各种各样的英语方面的考试.而学习英语,很 ...
- 猫咪记单词——NABCD模型分析
N --Need 需求:学习英语是一件非常重要的事.面对各种各样的考试,学习英语,最重要的就是词汇量,背单词是提高词汇量的最直接的方法,但是单纯的背单词太单调.寻找一些合适的,更易于接受的背单词学习英 ...
- 数据结构 — 浅析红黑树原理以及实现
浅析红黑树原理以及实现 我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到平衡二叉树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找.插入 和删除在平均 和 最坏情况下都是O(log ...
- Android 序列化 ---- Parcelable原理分析
Parcelable是专门为Android设计的序列化接口.它是基于内存,底层是通过指针挪动实现.因此,执行效率比Java的Serializable要高的多,号称快10倍. 一个简单的使用Parcel ...
- 华为猫复活记(ADSL猫固件升级失败修复)
回忆: 当偶N年前还是个菜菜时,瞎设置华为猫最后以除了power之外LED都不亮告终,晕啊!花200多块钱买的...还不会修(当时的猫捏么贵啊!),而且还不会修...... 自己去搜寻知识还有那台陪伴 ...
- 4.21-4.26旅行记之山城重庆(二)
话外话:前几天,歪酷服务器老出问题,我的博客进不了.我当时一想,要是这博客就这么没了,我咋整?唉,肯定心里会觉得挺遗憾的,当然也仅仅是遗憾,有它固然好,没了,那不也算了,日子照样过. 在此,非常感谢歪 ...
最新文章
- java spring注解教程,spring注解
- excel打不开怎么修复_SD卡坏了怎么办?一招教你拯救文件!
- Linux常见命令(五)——rmdir
- 第二届清华大学项目管理精英训练营【敏捷个人】分享
- flask 快速入门链接
- Linux排障必备命令
- Deeplearnng.AI第四部分第二周、经典网络
- mysql not in报错_mysql从5.7升级到8.0查询报错Expression #2 of SELECT list is not in GROUP BY...
- 当直播电商用上 AI 实时翻译,歪果仁也能听懂李佳琦
- java string类型时间比较大小吗_Java String类型时间比较大小
- vue中if和for指令不能同时使用
- python手机版教程视频_Python教学app下载
- 2021-2027中国游戏开发工具市场现状及未来发展趋势
- Pycharm修改镜像源并添加信任
- 不可重复读和幻读的区别(悲观锁和乐观锁)
- 项目管理必备的软件,实用方便
- 上网代理设置会被自动清空_每次开机IE代理服务器都被恶意设置,删除了,下次开机又出现,反反复复。我从没设置过它...
- 使用Matlab绘制gif动图
- 【微信小程序】-- 自定义组件 - 数据监听器 (三十四)
- UG NX 10 重新附着草图