Android面试回忆录:Serializable 都这么牛逼了,还要Parcelable有何用?

浩浩 等级 587 0 0

话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀。虽说我面试过的技术开发至少 50 人以上,但这还是第一次开始面试 Android,此时犹如大姑娘上轿,还真是头一回呀!

所以非常非常非常用心地准备了良久,然后满怀激动地开始了我的 Android 面试官角色。

无奈,面试后的感觉,均是开发效率听起来很牛逼,第三方 API 用起来非常顺手,但问到基础,就拿我面试系列的题去问,没一个答得上的,甚至是循循善诱,都没法好好回答。

Android面试回忆录:Serializable 都这么牛逼了,还要Parcelable有何用?

面试场景

Android 开发中对两个 Activity 之前传递数据,应该很熟悉吧?

嗯,当然没问题。一般采用 Intent.putXXX() 就可以实现各种轻量级数据的传递。

那对于自定义的 Object 呢?

直接使用 BundleputSerializable() 即可。需要把对象实现 Serializable 接口,最后使用 Intent.putExtras(Bundle) 把数据放进 Intent 即可。

除了这种方式,还有其它方式吗?和这种方式有什么区别呢?

我知道还有 Bundle.putParcelable() ,不过我们平时基本都只用 Serializable 方式。

为什么不用 Parcelable 方式呢?它们有什么不同呢?

因为简单呀,Serializable 方式只需要实现接口一句代码就好了,Parcelable 我记得有很多代码。对于它们的区别嘛,em......额......嗯.......

正文

上面的场景,实际上就是在我近期发生的。作为一个简历上 09 年入行的大龄 Android 程序员,我非常肯定他的开发能力和解决问题的能力,在这方面肯定甩我很多条街,不过至少在我问的问题上让我有点大跌眼镜,问到自定义 View 的绘制顺序,直接回答不知道。问到 LaunchMode,支支吾吾,不清楚。实际上不由得让我们思考,到底是怎么了,难道现在对于这么多的程序猿,写出符合需求的代码就变得这么重要了么?还好,当下还有很多坚持在一线,努力把基础带给大家的大神,比如,扔物线朱凯,还有非常非常多的伙伴们。

大多数人可能都知道,SerializableParcelable 方式最大的区别是效率上的差异,而且对于小数据,其实差异并不是很大,这些差别其实用户层面是并不容易发现的。但这并不代表着,我们的开发就可以忽视这几十毫秒甚至是几毫秒的差距。

Serializable 和 Parcelable 的区别

可以肯定的是,两者都是支持序列化和反序列化的操作。

两者最大的区别在于 存储媒介的不同Serializable 使用 I/O 读写存储在硬盘上,而 Parcelable 是直接 在内存中读写。很明显,内存的读写速度通常大于 IO 读写,所以在 Android 中传递数据优先选择 Parcelable

Serializable 会使用反射,序列化和反序列化过程需要大量 I/O 操作, Parcelable 自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多。

有人直接比较过两个的效率差别

Android面试回忆录:Serializable 都这么牛逼了,还要Parcelable有何用?

我们可以来看看分别怎么写?

  • 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 上花点时间了。

在两个 Activity 之间传递对象还需要注意什么呢?

对象的大小,对象的大小,对象的大小!!!

重要的事情说三遍,一定要注意对象的大小。Intent 中的 Bundle 是使用 Binder 机制进行数据传送的。能使用的 Binder 的缓冲区是有大小限制的(有些手机是 2 M),而一个进程默认有 16 个 Binder 线程,所以一个线程能占用的缓冲区就更小了( 有人以前做过测试,大约一个线程可以占用 128 KB)。所以当你看到 The Binder transaction failed because it was too large 这类 TransactionTooLargeException 异常时,你应该知道怎么解决了。

收藏
评论区

相关推荐

Android面试回忆录:Serializable 都这么牛逼了,还要Parcelable有何用?
话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀。虽说我面试过的技术开发至少 50 人以上,但这还是第一次开始面试 Android,此时犹如大姑娘上轿,还真是头一回呀! 所以非常非常非常用心地准备了良久,然后满怀激动地开始了我的 Android 面试官角色。 无奈,面试后的感觉,均是开发效率听起来很牛
AT大牛带你深度剖析Android 10大开源框架
做了几年的Android开发,也面试过不少公司,被面试过,也面试过不少人,其实Android的技术真的是无边界,不管你做过多牛的项目,不管你多久的经验在Android开发中不可能是停滞不前的,需要不断的学习及总结,否则难以解公关技术问题,下面把我压箱底的视频资料贡献给大家; 一,android视频教程 Android视频教程: 1,Android入门
JNI 基础 - Android 共享内存的序列化过程
1. 进程间的通信方式有哪些2. binder 和 socket 通信的区别有哪些3. Android 为什么在大部分场景下用 Binder 进行进程间通信4. Serializable 和 Parcelable 之间的区别5. Parcelable 序列化和反序列化的具体过程不知道大家在面试中的过程中,有没有碰到上面类似的问题,我在腾讯和 oppo 面试的
unity 集成sdk后自动打包脚本
set workpath=g:\unity3dwork\zsxd-android\client set unitypath="C:\Program Files (x86)\Unity472\Editor\Unity.exe" set toolpath=D:\adt-bundle-windows-x86_64-20140702\sdk\
Ubuntu14.04+eclipse下cocos2d
环境: ubuntu14.04 adt-bundle-linux-x86\_64 android-ndk-r9d-linux-x86\_64 cocos2d-x-3.0正式版 apache-ant 1.9.3 python 2.7(ubuntu自带) 加入环境变量 export ANDROID\_SDK\_ROOT=/home/yan
Android SDK Android Studio Android NDK 官方下载地址
2014.12 Android Studio https://dl.google.com/dl/android/studio/install/1.0.1/android-studio-bundle-135.1641136.exe https://dl.google.com/dl/android/studio/install/1.0.1/andro
Android Serializable与Parcelable原理与区别
一、序列化、反序列化是什么? ============== (1) 名词解释 -------- 对象的序列化 : 把[Java](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.2cto.com%2Fkf%2Fware%2FJava%2F)对象转换为字节序列并存储至一个储存媒介的过
Android webview获取html的内容
  Android用文本view加载HTML时,可以首先获取到html的内容,然后对html做自己想要的效果调整     [@Override](https://my.oschina.net/u/1162528)     protected void onCreate(Bundle savedInstanceState) {         supe
Android与H5混合开发
        Android 和 H5 在移动开发应用中非常广泛。市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的。而H5在制作炫酷动画网页方面比较给力,且具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以App和H5页面相结合就显得尤为重要。而android
Android入门:HTML布局中Android程序与JAVASCRIPT的交互
1、JAVASCRIPT调用Android里面的方法 //主函数 public class VMusicActivity extends Activity { @Override public voidonCreate(Bundle savedInstanceState) {
Android开发:Android虚拟机启动错误Can't find 'Linux version ' string in kernel image file
**Android启动出错,虚拟机报错信息如下:**   Starting emulator for AVD 'test' _emulator: ERROR: Can't find 'Linux version ' string in kernel image file: E:\\CoCosStudio\\ADT\\adt-bundle-windows
Android的消息处理机制(图+源码分析)——Looper,Handler,Message
作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想。android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种helper类,对于和我一样渴望水平得到进阶的人来说,都太值得一读了。这不,前几天为了了解android的消息处理机制,我看了**Looper,Handler,
EventBus学习
1. 基本的:http://www.360doc.com/content/14/0821/16/19022950\_403599285.shtml 2. 详细的:http://www.cnblogs.com/angeldevil/p/3715934.html 前几天,有个朋友遇到一个面试题,问在一个 android applic
Kotlin Hello World
1 Kotlin ======== Kotlin是一种在JVM上运行的静态类型编程语言,被称为Android界的Wsift,由JetBrains设计。Kotline可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。Google宣布在Google I/O 2017上宣布Kotlin成为Android官方语言。 笔者不
ReactNaive集成入android(一)
1.出现RNgetSupport的问题时往往都是assets的文件夹没有创建,创建好bundle文件就可以了 mkdir -p android/app/src/main/assets react-native bundle --platform android --dev false --entry-file index.android.js \--bu