在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,甚至用字符串也可以实现。

一人一猫旅行记之浅析序列化及原理相关推荐

  1. 小e的每日一画 之 飞毯旅行记 20071231

    作者:小e,年龄:5岁9个月,打字:老豆 飞毯旅行记 有一天,阿魔对阿豆说:"咱们家那么穷,能买什么呢?" 阿豆说:"我也不知道,咱们找一个聪明的人去问问吧." ...

  2. 兔年伊始谈闲书:三体-乌合之众-百年孤独 和《猫城记》(随笔)

     引言  " 各位读者,我们都兔年大吉,新春快乐. 我本想写一篇<公有云换帅转舵后的错误经验和正经歪念>,但刚过年就炮火味十足,觉得有失体面.所以就写了篇读书的散记杂记. 本文和 ...

  3. 读《猫城记》 | 人间失格

    猫城记是老舍先生在1932年完成的一部科幻讽刺小说,故事是老舍先生梦到自己乘坐飞船到火星,结识到当地一种智慧生物--猫人,进而了解到猫人的社会现状,失格的经济.教育.政治,直到猫人国灭亡,返回地球. ...

  4. 软件需求分析之猫咪记单词

    软件需求分析之猫咪记单词 一.软件设计目标 目前,所有学生都面临学习英语的问题.在大学生中学生对于手机的应用十分频繁,所以我们设置单词解屏,可以使学生拿起手机就学习英语,提高学习效率,应用零散时间. ...

  5. NABCD模型(猫咪记单词)

    项目需求分析与建议-NABCD模型(猫咪记单词) N (Need 需求) 对于现在的学生,尤其是大学生来说,学习英语是一件非常重要的事.我们有四级六级托福雅思等各种各样的英语方面的考试.而学习英语,很 ...

  6. 猫咪记单词——NABCD模型分析

    N --Need 需求:学习英语是一件非常重要的事.面对各种各样的考试,学习英语,最重要的就是词汇量,背单词是提高词汇量的最直接的方法,但是单纯的背单词太单调.寻找一些合适的,更易于接受的背单词学习英 ...

  7. 数据结构 — 浅析红黑树原理以及实现

    浅析红黑树原理以及实现 我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到平衡二叉树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找.插入 和删除在平均 和 最坏情况下都是O(log ...

  8. Android 序列化 ---- Parcelable原理分析

    Parcelable是专门为Android设计的序列化接口.它是基于内存,底层是通过指针挪动实现.因此,执行效率比Java的Serializable要高的多,号称快10倍. 一个简单的使用Parcel ...

  9. 华为猫复活记(ADSL猫固件升级失败修复)

    回忆: 当偶N年前还是个菜菜时,瞎设置华为猫最后以除了power之外LED都不亮告终,晕啊!花200多块钱买的...还不会修(当时的猫捏么贵啊!),而且还不会修...... 自己去搜寻知识还有那台陪伴 ...

  10. 4.21-4.26旅行记之山城重庆(二)

    话外话:前几天,歪酷服务器老出问题,我的博客进不了.我当时一想,要是这博客就这么没了,我咋整?唉,肯定心里会觉得挺遗憾的,当然也仅仅是遗憾,有它固然好,没了,那不也算了,日子照样过. 在此,非常感谢歪 ...

最新文章

  1. java spring注解教程,spring注解
  2. excel打不开怎么修复_SD卡坏了怎么办?一招教你拯救文件!
  3. Linux常见命令(五)——rmdir
  4. 第二届清华大学项目管理精英训练营【敏捷个人】分享
  5. flask 快速入门链接
  6. Linux排障必备命令
  7. Deeplearnng.AI第四部分第二周、经典网络
  8. mysql not in报错_mysql从5.7升级到8.0查询报错Expression #2 of SELECT list is not in GROUP BY...
  9. 当直播电商用上 AI 实时翻译,歪果仁也能听懂李佳琦
  10. java string类型时间比较大小吗_Java String类型时间比较大小
  11. vue中if和for指令不能同时使用
  12. python手机版教程视频_Python教学app下载
  13. 2021-2027中国游戏开发工具市场现状及未来发展趋势
  14. Pycharm修改镜像源并添加信任
  15. 不可重复读和幻读的区别(悲观锁和乐观锁)
  16. 项目管理必备的软件,实用方便
  17. 上网代理设置会被自动清空_每次开机IE代理服务器都被恶意设置,删除了,下次开机又出现,反反复复。我从没设置过它...
  18. 使用Matlab绘制gif动图
  19. 【微信小程序】-- 自定义组件 - 数据监听器 (三十四)
  20. UG NX 10 重新附着草图

热门文章

  1. SAEJ3061汽车信息安全指南文档
  2. 机器人工作空间解析分析
  3. 推荐一个在线办公协作的
  4. Xilinx XC7Z020双核ARM+FPGA开发板试用合集——硬件赏析
  5. word论文各类对齐终极解决方法——制表符
  6. word中如何插入制表符
  7. Black Hat USA 2011: Alexander Polyakov - CTO - ERPScan
  8. 毕达哥拉斯定理/勾股定理
  9. 见缝插针的人_“见缝插针”的创意人生
  10. 计算机大赛横幅标语有趣的,有创意的横幅标语大全