Moosphan/Android-Daily-Interview

2019-04-03:Serializable和Parcelable的区别?

FeatherHunter opened this issue · 11 comments

2019-04-03:Serializable和Parcelable的区别?

都是安卓常用到的序列化对象,Parcelable要手动写构造函数和writeToParcel,不过现在as都是自动生成的,Serializable是声明一下接口就行了。Parcelable比Serializable性能强,Serializable在使用是会产生大量临时变量,增加GC回收频率。但是Serializable的数据是以IO流在磁盘,而Parcelable是写在内存,所以Parcelable无法将数据更好的持久化。

Serializable是属于Java自带的,本质是使用了反射。序列化的过程比较慢,这种机制在序列化的时候会创建很多临时的对象,比引起频繁的GC。Parcelable 是属于 Android 专用。不过不同于Serializable,Parcelable实现的原理是将一个完整的对象进行分解。而分解后的每一部分都是Intent所支持的数据类型。 如果在内存中使用建议Parcelable。持久化操作建议Serializable

Android中序列化有两种方式:Serializable以及Parcelable。其中Serializable是Java自带的,而Parcelable是安卓专有的。
Seralizable相对Parcelable而言,好处就是非常简单,只需对需要序列化的类class执行就可以,不需要手动去处理序列化和反序列化的过程,所以常常用于网络请求数据处理,Activity之间传递值的使用。
Parcelable是android特有的序列化API,它的出现是为了解决Serializable在序列化的过程中消耗资源严重的问题,但是因为本身使用需要手动处理序列化和反序列化过程,会与具体的代码绑定,使用较为繁琐,一般只获取内存数据的时候使用。

今天人好多

1.. Parcelable 的读写顺序必须一致, 为什么要这样呢?
2.. Intent 传值有大小限制;
第二个问题, 不太好找, 我简单回答一下:
Intent 中的 Bundle 是使用 Binder 机制进行数据传送的, 数据会写到内核空间, Binder 缓冲区域;
Binder 的缓冲区是有大小限制的, 有些 ROM 是 1M, 有些 ROM 是 2M;
这个限制定义在 frameworks/native/libs/binder/processState.cpp 类中, 如果超过这个限制, 系统就会报错;

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2)) ;   

因为 Binder 本身就是为了进程间频繁-灵活的通信所设计的, 并不是为了拷贝大量数据;

gs666 commented

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

Seralizable要注意添加一个static final的serialVersionUID,注意静态变量属于类,不属于对象,所以不会参与序列化,用transient关键字标记的成员变量不会参与序列化。
Seralizable使用了IO流来写入和读出数据,而Parcelable是通过native方法(Parcel.cpp)来将对象通过JNI写到内存中,
Seralizable不一定会比Parcelable慢,要看具体情况,
推荐参考:https://mp.weixin.qq.com/s/NNClO9YmkPQMumzqsgnOgg

Serializable和Parcelable的区别?

提到这两个,就应该说一些序列化:将对象转化成可以传输的二进制流的过程,这样就可以将转化后的数据进行网络传输或者保存到本地流去,这是一种便于数据传输的方法;

反序列化就是二进制流转成对象的过程

Serializable

是Java语言为我们提供的一个标准化的序列化接口,会有频繁IO操作,消耗资源大,但是实现方式简单;


Parcelable

是Android专有的序列化接口;效率高,但是实现稍微复杂;


两者的选用规则大概可以分为:

​ 内存序列化上选择Pracelable

​ 存储到设备或网络传输选择serializable(用parcelable也可以,但稍微复杂)

serializable 由java提供序列化于硬盘中 实现简单 效果低
parcelable 由android提供 序列化于内存中 实现复杂 效果高

Serializable只是标记了可以序列化,被标记的类之后可用于存到磁盘中和网络传输