Android序列化接口Parcelable与Serializable接口对比
作者:小尹编码中... 发布时间:2023-03-24 17:48:59
Parcelable
优点:
google专门为安卓写的序列化接口
性能好,内存开销小,效率高,写起来复杂
缺点:
各个机型可能有差异,Parcelable使用会产生差异
通讯组件之间(AIDL ,INTENT)的数据传递,可以使用Parcelable
写入存储设备推荐使用Serializable
public class MyParcelable implements Parcelable {
* private int mData;//参数
* public int describeContents() {//类描述,一般不管他
* return 0;
* }
* public void writeToParcel(Parcel out, int flags) {//序列化 :out写入参数,要注明参数类型 flag一般默认是0,1代表对象需要返回,不回收
* out.writeInt(mData);
* }
* public static final Parcelable.Creator<MyParcelable> CREATOR//反序列化操作
* = new Parcelable.Creator<MyParcelable>() {
* public MyParcelable createFromParcel(Parcel in) {
* return new MyParcelable(in);
* }
* public MyParcelable[] newArray(int size) {
* return new MyParcelable[size];
* }
* };
* private MyParcelable(Parcel in) {
* mData = in.readInt();
* }
* }
google官方也是很贴心呀,直接把怎么用放在源码的注释里了
Serializable
优点:
java自带的序列化接口
Serializable是一个空接口,使用简单,是一个标识,会给类一个序列化UID
缺点:
因为使用的是反射,使用性能差,内存开销大
package java.io;
// Android-added: Notes about serialVersionUID, using serialization judiciously, JSON.
public interface Serializable {
}
Serializable 是一个空接口,用来标识当前类可以被 ObjectOutputStream序列化,以及被ObjectInputStream反序列化
Parcelable与Serializable的性能比较
在内存的使用中,Parcelable在性能方面要强于Serializable
Serializable在序列化操作的时候会产生大量的临时变量,(原因是使用了反射机制)从而导致GC的频繁调用,因此在性能上会稍微逊色
Parcelable是以Ibinder作为信息载体的,在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable
在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上
虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化 (原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)
总结:
Java应用程序中有Serializable来实现序列化操作
Android中有Parcelable来实现序列化操作
在Android中除了对数据持久化的时候需要使用到Serializable来实现序列化操作,其他的时候我们仍然需要使用Parcelable来实现序列化操作
在Android中效率并不是最重要的,而是内存, 通过比较Parcelable在效率和内存上强于Serializable
个人小建议:
尽管Parcelable实现起来比较复杂,但是如果我们想要成为一名优秀的Android软件工程师,那么我们就需要勤快一些去实现Parcelable,而不是偷懒与实现Serializable,当然实现Serializable也可以
来源:https://blog.csdn.net/Ai1114/article/details/125246559
猜你喜欢
- Java流程控制用户交互Scannerjava.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入基本语
- 我们常常需要对数据进行查找,修改,查找数据有许多方法,我们先看看最简单的顺序查找int main(){int i, k = 0;scanf(
- 具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必
- 因为项目需要,需要在一个之前没做过springBoot项目的eclipse上跑一个springBoot项目并完成打包,所以就在网上查完资料以
- 项目完整代码链接:代码链接跨服务上传文件示意图一、创建项目springboot:2.2.6JDK:1.8由于资源有限,就用不同端口表示不同服
- 本文实例讲述了Android游戏开发学习①弹跳小球实现方法。分享给大家供大家参考。具体如下:在学习了一点点Android之后,觉得有必要记录
- 本文实例为大家分享了C#实现餐厅管理系统的具体代码,供大家参考,具体内容如下部分代码:fm_change_password.csusing
- 本文告诉大家如何使用相同权限调用cmd并且传入命令。如果想要用相同的权限运行一个程序,可以使用 ProcessStartInfo 的方法&n
- 1、写在前面今天群里一个小伙伴问了这样一个问题,扩展方法与实例方法的执行顺序是什么样子的,谁先谁后(这个问题会在文章结尾回答)。所以写了这边
- 在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。使用流程【1】准备工作:在项目的工具包下导入HttpClient
- 前言本篇文章主要讲述的是SpringBoot整合Mybatis、Druid和PageHelper 并实现多数据源和分页。其中SpringBo
- 前言简单来说机器学习的核心步骤在于“获取学习数据;选择机器算法;定型模型;评估模型,预测模型结果”,下面本人就以判断日报内容是否合格为例为大
- 前段时间分享了《阅读跟踪 Java 源码的几个小技巧》是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧。所
- 本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下。具体功能代码如下:主要功能部分代码如下:/// <summ
- 1.什么是虚函数?用virtual 修饰的成员函数叫虚函数小知识: 没有虚构造函数
- Android中的异步消息机制分为四个部分:Message、Handler、MessageQueue和Looper。其中,Message是线
- 有时候需要动态添加数据,屏幕显示满了,数据需要滚动展示。这里主要弄懂scrollTo(0, off)方法的含义喊用法。含义不说了,大概意思就
- 最近碰到一个大转盘的业务,奖品可根据数据后台灵活设置中奖概率,看起来挺简单的业务功能,但实现起来对我这个毫无经验的人来说并不容易,后面又碰到
- for循环和foreach循环的区别首先在这里声明一点,C#和Java这两种语言很相似,尤其是初学的数据类型那一部分,所以这里写的for和f
- SpringBoot使用Commons Logging进行所有内部日志记录,但保留底层日志实现。默认提供了Java Util Logging