Serializable 都这么牛逼了,Parcelable 还要你何用?
一些闲聊
距离上一篇文章似乎又是很久了,看起来也没有很多反馈,催更就更不用说了。哈哈,放弃了。
话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀。虽说我面试过的技术开发至少 50 人以上,但这还是第一次开始面试 Android,此时犹如大姑娘上轿,还真是头一回呀!
所以非常非常非常用心地准备了良久,然后满怀激动地开始了我的 Android 面试官角色。
无奈,面试后的感觉,均是开发效率听起来很牛逼,第三方 API 用起来非常顺手,但问到基础,就拿我面试系列的题去问,没一个答得上的,甚至是循循善诱,都没法好好回答。
面试场景
Android 开发中对两个 Activity 之前传递数据,应该很熟悉吧?
嗯,当然没问题。一般采用 Intent.putXXX()
就可以实现各种轻量级数据的传递。
那对于自定义的 Object 呢?
直接使用 Bundle
的 putSerializable()
即可。需要把对象实现 Serializable
接口,最后使用 Intent.putExtras(Bundle)
把数据放进 Intent
即可。
除了这种方式,还有其它方式吗?和这种方式有什么区别呢?
我知道还有 Bundle.putParcelable()
,不过我们平时基本都只用 Serializable
方式。
为什么不用
Parcelable
方式呢?它们有什么不同呢?
因为简单呀,Serializable
方式只需要实现接口一句代码就好了,Parcelable
我记得有很多代码。对于它们的区别嘛,em......额......嗯.......
正文
上面的场景,实际上就是在我近期发生的。作为一个简历上 09 年入行的大龄 Android 程序员,我非常肯定他的开发能力和解决问题的能力,在这方面肯定甩我很多条街,不过至少在我问的问题上让我有点大跌眼镜,问到自定义 View 的绘制顺序,直接回答不知道。问到 LauchMode,支支吾吾,不清楚。实际上不由得让我们思考,到底是怎么了,难道现在对于这么多的程序猿,写出符合需求的代码就变得这么重要了么?还好,当下还有很多坚持在一线,努力把基础带给大家的大神,比如,扔物线朱凯,还有非常非常多的伙伴们。
大多数人可能都知道,Serializable
和 Parcelable
方式最大的区别是效率上的差异,而且对于小数据,其实差异并不是很大,这些差别其实用户层面是并不容易发现的。但这并不代表着,我们的开发就可以忽视这几十毫秒甚至是几毫秒的差距。
Serializable 和 Parcelable 的区别
可以肯定的是,两者都是支持序列化和反序列化的操作。
两者最大的区别在于 存储媒介的不同,Serializable
使用 I/O 读写存储在硬盘上,而 Parcelable
是直接 在内存中读写。很明显,内存的读写速度通常大于 IO 读写,所以在 Android 中传递数据优先选择 Parcelable
。
Serializable
会使用反射,序列化和反序列化过程需要大量 I/O 操作, Parcelable
自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多。
有人直接比较过两个的效率差别
我们可以来看看分别怎么写?
- Serializable 「简单易用」一直都是它的代名词
public class TestSerializable implements Serializable {
String msg;
List<ItemBean> datas;
public static class ItemBean implements Serializable{
String name;
}
}
- Parcelable 速度至上
public class TestParcelable implements Parcelable {
String msg;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.msg);
}
TestParcelable(String msg) {
this.msg = msg;
}
private TestParcelable(Parcel in) {
this.msg = in.readString();
}
public static final Creator<TestParcelable> CREATOR = new Creator<TestParcelable>() {
@Override
public TestParcelable createFromParcel(Parcel source) {
return new TestParcelable(source);
}
@Override
public TestParcelable[] newArray(int size) {
return new TestParcelable[size];
}
};
}
很明显,Parcelable
实现起来并不容易,它有成吨的模板代码,这使得对象变得难以阅读和维护。但如果你真的想成为一个优秀的 Android 开发工程师,你可能就得多在 Parcelable
上花点时间了。实在想偷懒也没事,因为有人在 GitHub 上已经上传了 Android Studio 的插件,帮助你自动生成这一堆模板。
地址:https://github.com/mcharmas/android-parcelable-intellij-plugin
在两个 Activity 之间传递对象还需要注意什么呢?
对象的大小,对象的大小,对象的大小!!!
重要的事情说三遍,一定要注意对象的大小。Intent
中的 Bundle
是使用 Binder
机制进行数据传送的。能使用的 Binder 的缓冲区是有大小限制的(有些手机是 2 M),而一个进程默认有 16 个 Binder
线程,所以一个线程能占用的缓冲区就更小了( 有人以前做过测试,大约一个线程可以占用 128 KB)。所以当你看到 The Binder transaction failed because it was too large
这类 TransactionTooLargeException
异常时,你应该知道怎么解决了。
Serializable 都这么牛逼了,Parcelable 还要你何用?的更多相关文章
- 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生
科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生 黑科技,还是要提D.E.Shaw Research这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲D.E. Shaw这个人是怎 ...
- 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路
做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...
- 最牛逼的任务调度工具 | Quartz
Quartz 是一个完全由 Java 编写的开源作业调度框架,不要让作业调度这个术语吓着你,其实不难.尽管 Quartz 框架整合了许多额外功能,但就我们使用来说,你会发现它易用得简直让人受不了! 简 ...
- 如何设计一个牛逼的API接口
在日常开发中,总会接触到各种接口.前后端数据传输接口,第三方业务平台接口.一个平台的前后端数据传输接口一般都会在内网环境下通信,而且会使用安全框架,所以安全性可以得到很好的保护.这篇文章重点讨论一下提 ...
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...
- 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)
我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...
- 最牛逼android上的图表库MpChart(一) 介绍篇
最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...
- .Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】
博主推荐一:WP8.1最经典培训教程 博主点评:经典Windows Phone8.1 Runtime API培训最经典教程,此教程由传智播客蒋坤老师录制的一整套WP8.1入门级视频教程,讲授内容非常广 ...
- NBU是最牛逼的备份软件
NBU是最牛逼的备份软件 TSM是IBM的备份 好好看看几个厂商 VERITAS 公司下的NBU入门级备份有BEHP的备份软件有DPIBM的是TSMCommvault也非常牛逼这都是做到了小机AI ...
随机推荐
- eclipse+fileSyncPlugin+svn+jenkins+tomcat
实现一个想法,把项目部署在linux服务器上,在本地的eclipse代码更新后,通过svn+jenkins自动同步到服务器, 然后通过eclipse远程debug项目.这样是不是就解决了在本地跑项目, ...
- Centos 7.0 execute yum update ——File "/usr/libexec/urlgrabber-ext-down", line 75, in <module> 解决方式
[打开这个文件:/usr/lib/python2.7/site-packages/urlgrabber/grabber.py找到elif errcode in (42, 55,56) 用 eli ...
- mybatis mysql 批量插入
场景描述: 使用mybatis操作mysql数据库,进行批量插入数据,提高代码质量和执行效率. 环境: mybatis spring mysql java xml配置文件 <insert id ...
- mysql安装教程以及配置快捷方式
1.首先双击exe 3.Next 安装过程省略.... Win+r 然后输入:cmd 打开dos窗口后: 输入: mysql -uroot -p你设置的密码 案例:mysql -uroot -proo ...
- 虚拟专用网VPN
1. 三个专用地址块: (1)10.0.0.0到10.255.255.255 (2)172.16.0.0到172.31.255.255 (3)192.168.0.0到192.168.255.255 2 ...
- Android 6.0运行时权限
一.Runtime Permissions Android 6.0在手机安全方面做的一个处理就是增加了运行时权限(Runtime Permissions). 新的权限机制更好的保护了用户的隐私,Goo ...
- Coredata中的多线程
=================== 疑问: 1.coredata是什么?结构 2.如果在简单的demo中,我们可以在主线程中使用coredata.但是如果在真正的大项目中,这样可行么? 3.假设都 ...
- 白皮书之C++学习第一天
大三荒废了一年的时间在lol上,上头了吧.后悔也来不及了,总之我会拼命追回来的! 今天重拾起这本白皮书,也是很感慨啊! 废话不多说,好好学,好好找工作吧!大三结束了啊! 每个C++程序都有一个main ...
- Ionic3 创建应用后,目录结构
ionic start myApp blank (空项目) hooks --编译cordova时自定义的脚本命令,方便整合到我们的编译系统和版本控制系统中 node_modules --node各类依 ...
- SQL语句查询表中的所有约束
select * from sysobjects where parent_obj in(select id from sysobjects where name='表名') 或者 exec sp_h ...