serializable和Parcelable

本文对比了Java中的Serializable与Android特有的Parcelable两种序列化方式。详细解释了它们的工作原理、使用场景及优缺点,帮助开发者理解何时选用哪种序列化方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先搞清楚为什么要序列化: 为了传递对象,或将对象传化成可传输或可存储的状态;

因为intent要想传递对象的话,那么这个对象一定是实现了Serializable或Parcelable接口的;

2.他们俩有啥区别呢:

   Serializable是Java自带的,将一个对象传化成可传输或可存储的状态,可以用于网络传输,以及本地存储等;Seralizable相对Parcelable而言,好处就是非常简单,只需对需要序列化的类class(JavaBean)执行就可以,不需要手动去处理序列化和反序列化的过程,所以常常用于网络请求数据处理,Activity之间传递值的使用;

 Parcelable是专门为Android的序列化API,Parcelable能达到永久性的保存对象到本地文件,也能实现网络传输对象;   选择序列化的原则

①.在效率和内存优化方面优先选Parcelable,因为Serializable序列化会大量的产生临时变量,这样会频繁的GC造成卡顿;

②.Serializable简单,Parcelable复杂但是效率高,而且内存使用性能更好)

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


Serializable 序列化过程使用了反射技术,并且期间产生临时对象。优点代码少。是利用反射创建了一个对象,调用该类的第一个非Serializable类型的父类的无参构造方法。所以这就是为什么通过反序列化创建对象的时候,并不会执行被序列化对象的构造方法。对于实现Serializable接口的类,并不要求该类具有一个无参的构造方法, 因为在反序列化的过程中实际上是去其继承树上找到一个没有实现Serializable接口的父类(最终会找到Object),然后构造该类的对象,再逐层往下的去设置各个可以反序列化的属性(也就是没有被transient修饰的非静态属性)

Serializable:

(人不去指定,默认情况下)序列号:原则上序列化后的序列号和之前的序列号相同才能正常的被反序列化;

注意一点:应该手动指定序列号,如果不手动指定的话,在类结构发生改变的情况下,重新计算获取得新UID序列号发生了改变,导致反序列化失败

首先创建一个实现了Serializable接口的一个对象;(里面很多方法都采用了JavaBean的形式)

然后就可以在Intent中传递这个实现了Serializable接口的对象了:

接收对象的那端是怎么实现的?

原理(通过write方法序列化,read方法反序列化;Parcelable也是如此):

Parcelable:

原理:通过writetoparcel()方法来序列化,CREATOR中反序列化;

然后也是一样,在intent中发送实现了Parcelable接口的对象;

最后接受intent的类中:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值