Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
FeatherHunter opened this issue Apr 2, 2019 · 11 comments
Open

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

FeatherHunter opened this issue Apr 2, 2019 · 11 comments

Comments

@FeatherHunter
Copy link
Collaborator

No description provided.

@Moosphan Moosphan changed the title 2019-04-03 Serializable和Parcelable的区别? 2019-04-03:Serializable和Parcelable的区别? Apr 3, 2019
@q514414232
Copy link

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

@maxunjian
Copy link

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

@Ssuiyingsen
Copy link

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

@ADrunkenLiBai
Copy link

今天人好多

@Alex-Cin
Copy link

Alex-Cin commented Apr 5, 2019

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
Copy link

gs666 commented Aug 28, 2020

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

@chenyucheng97
Copy link

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

@kuye910
Copy link

kuye910 commented Nov 26, 2021

Serializable和Parcelable的区别?

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

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

Serializable

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


Parcelable

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


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

​ 内存序列化上选择Pracelable

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

@mlinqirong
Copy link

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

@nujnay
Copy link

nujnay commented Mar 22, 2022

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

@luckilyyg
Copy link

luckilyyg commented Mar 22, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests