Android-Daily-Interview icon indicating copy to clipboard operation
Android-Daily-Interview copied to clipboard

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

Open FeatherHunter opened this issue 5 years ago • 11 comments

FeatherHunter avatar Apr 02 '19 16:04 FeatherHunter

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

q514414232 avatar Apr 03 '19 01:04 q514414232

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

maxunjian avatar Apr 03 '19 01:04 maxunjian

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

Ssuiyingsen avatar Apr 03 '19 01:04 Ssuiyingsen

今天人好多

ADrunkenLiBai avatar Apr 03 '19 01:04 ADrunkenLiBai

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 本身就是为了进程间频繁-灵活的通信所设计的, 并不是为了拷贝大量数据;

Alex-Cin avatar Apr 05 '19 05:04 Alex-Cin

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

gs666 avatar Aug 28 '20 10:08 gs666

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

chenyucheng97 avatar Sep 18 '20 07:09 chenyucheng97

Serializable和Parcelable的区别?

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

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

Serializable

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


Parcelable

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


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

​ 内存序列化上选择Pracelable

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

kuye910 avatar Nov 26 '21 07:11 kuye910

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

mlinqirong avatar Dec 28 '21 03:12 mlinqirong

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

nujnay avatar Mar 22 '22 11:03 nujnay

这是来自QQ邮箱的假期自动回复邮件。  

luckilyyg avatar Mar 22 '22 11:03 luckilyyg