Android Serializable与Parcelable

Android 中 Parcelable和Serializable的区别 本文主要介绍Parcelable和Serializable的作用、效率、区别及选择。 1、作用 Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方 便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及 不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。 从 阅读详情

Android Serializable与Parcelable

Serializable与Parcelable是用来保存或传送Java对象

1. 序列化和反序列化

  Java对象包含变量与方法。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。

  • 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
  • 对象的反序列化:把字节序列恢复为Java对象的过程。

2. Java对象与Java对象序列化的区别

  Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象,在现有Java对象的机制下都不可能完成。
  与Java对象不同的是,如果对Java对象执行序列化操作,因为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。

3. Android 中Serializable与Parcelable区别与选择原则

  • 区别: 两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。
    Serializable不是当前关注的焦点,不过可以查看《Java序列化算法透析》这篇文章中实现一个简单的Serializable例子,查看序列化生成的IO文件,并且以16进制读取并一一解释每一个16进制数字的含义。

  • 选择原则:
    Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存到sd卡或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。
    Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。在不同app间通过Intent传递对象(不同进程间),不能使用Parcelable,需要使用Serializable,当然最好使用AIDL

4. 代码编写

  对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可,此ID可由系统生成。而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

Parcelable举例

public class MyParcelable implements Parcelable {
    private int mData;
    private String mStr;

public int describeContents() {
    return 0;
}

 // 写数据进行保存
public void writeToParcel(Parcel out, int flags{
    out.writeInt(mData);
    out.writeString(mStr);
}

 // 用来创建自定义的Parcelable的对象
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();
     mStr = in.readString();
 }

}

注意:
Parcel的写入和读出顺序需要保持一致。如果元素是list读出时需要先new一个ArrayList传入,否则会报空指针异常。如下:

list = new ArrayList<String>();
in.readStringList(list);

Serializable序列化不保存静态变量,可以使用Transient关键字对部分字段不进行序列化,也可以覆盖writeObject、readObject方法以实现序列化过程自定义

以下4点摘自《探索Android中的Parcel机制(上)》

  1. 个读写全是在内存中进行,主要是通过malloc()、realloc()、memcpy()等内存操作进行,所以效率比JAVA序列化中使用外部存储器会高很多;
  2. 读写时是4字节对齐的,可以看到
    #define PAD_SIZE(s) (((s)+3)&~3) 这句宏定义就是在做这件事情;
  3. 如果预分配的空间不够时newSize = ((mDataSize+len)*3)/2;会一次多分配50%;
  4. 对于普通数据,使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址。后者是通过flatten_binder()和unflatten_binder()实现的,目的是反序列化时读出的对象就是原对象而不用重新new一个新对象。

转自:
http://www.cnblogs.com/trinea/archive/2012/11/09/2763213.html
http://www.2cto.com/kf/201403/288476.html

Android 序列化之Serializable和Parcelable Serializable的设计初衷是为了序列化对象到本地文件、数据库、网络流、RMI以便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是由于Serializable效率过低,消耗大,而android中数据传递主要是在内存环境中(内存属于android中的稀有资源),因此Parcelable的出现为了满足数据在内存中低开销而且高效地传递问题。 阅读详情

相关推荐

Android 序列化(Serializable和Parcelable)

Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。我把自己这段时间整理的Android最重要最热门的学习方向资料放在了我的GitHub,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。

m0_61549984的博客 1035

Android Parcelable和Serializable的区别与联系

在Android开发中,Parcelable和Serializable是两种用来在组件之间传递数据的序列化机制。它们有不同的使用场景和性能特点。

执剑人 1162

【Android中级】Serializable与Parcelable的区别

今天刚好看到了Intent的源码,发现它实现了Parcelable接口,突然想起了Java里面还有一个Serializable接口,于是想借此机会谈谈自己对这两个接口的看法。 在安卓里面,我们都知道无法直接把对象传给activity,为了传递对象,这些对象要么必须实现Serializable接口,要么必须实现Parcelable接口。那到底这两者有什么区别呢?我们先来看看Serializabl...

snowyeti的博客 943

Android——Serializable与Parcelable

Serializable与Parcelable的序列化与反序列化Serializable的介绍Serializable的序列化Serializable的反序列化Parcelable的介绍Parcelable的序列化与反序列化 Serializable的介绍 Serializable是JAVA提供的一个空接口,为对象提供标准的序列化与反序列化。 我们实现Serializable接口,需要让一个实体类实现此接口,并声明一个SerialVersionUID,其实SerialVersionUID并不是必须的,如果不

FranzLiszt的博客 2477

Android Serializable和Parcelable的区别及其使用

要将一个实现了Serializable接口的对象转换为Parcelable,我们首先需要为该对象实现Parcelable接口所规定的方法。为了实现Parcelable接口,一个类需要完成以下几个关键步骤:首先,它需要实现writeToParcel方法,该方法负责将对象的状态(即成员变量的值)写入到一个Parcel对象中。例如,在一个复杂的Android应用中,如果需要在多个Activity或Service之间频繁传递包含大量字段的自定义对象,使用Parcelable可以显著提升应用的响应速度和用户体验。

大模型大数据攻城狮的专栏 791

ESP32-S3开发环境避坑指南:VS Code+ESP-IDF离线安装全流程(附国内镜像加速)

本文提供了一份详细的ESP32-S3开发环境离线安装指南,重点解决网络依赖问题。通过整合国内镜像加速,手把手教你完成VS Code、ESP-IDF框架、工具链及Python依赖的本地化部署,实现稳定、可重复的开发环境搭建,大幅提升IoT开发效率。

peach的博客 962

安卓——使用Intent传递对象,Serializable或Parcelable

基本操作就是实现Serializable或Parcelable接口,并将对象作为额外数据(extra)添加到Intent中。我们先讲述第一种方法:

weixin_73588491的博客 1320

[0352]基于JAVA的停车场收费智慧管理系统的设计与实现

其次,从经营管理层面考虑,本系统涵盖了丰富的月卡管理和财务结算功能,如月卡用户管理、缴费、注销、挂失、解挂、补办等全流程服务,以及临保和月保的结算汇总与欠费查询等功能,这不仅有助于规范停车场的日常运营管理,更能有效提高财务管理效率,降低运营成本,实现精细化、数字化的财务管控。综上所述,本课题计划研发的基于Java的停车场收费智慧管理系统将在现有研究成果的基础上,重点优化月卡用户全生命周期管理和财务统计分析功能,以满足现代停车场高效、精准、安全的管理需求,紧跟行业发展趋势,为推动智慧城市的建设贡献一份力量。

muyu2980的专栏 589

Android中的Serializable、Parcelable

Parcelable 这是一个接口,它的实例可以写入Parcel或从Parcel恢复。实现Parcelable的类必须要有一个实现了Parcelable.Creator接口的类型的非空静态字段CREATOR,这个字段是帮忙从一个Parcel产生一个Parcelable类的实例。 public class MyParcelable implements Parcelable { private int mData; public int describeContents() {

weixin_40763897的博客 1750

【BLE系列-第六篇】GATT解析:属性、特征、描述符的逻辑关系

本文系统介绍了BLE协议中的ATT和GATT机制。ATT以"属性"为基本数据单元,包含UUID、Handle、权限和Value四个要素。GATT则在ATT基础上构建了服务、特征和描述符的层次结构:服务(UUID:0x2800/0x2801)通过声明属性标识,特征声明(UUID:0x2803)指向特征值(UUID:0x2Axx或自定义),描述符(UUID:0x2900~0x290F)提供附加信息。GATT复用ATT发现机制,通过定义特定UUID语义实现服务发现和特征管理。这种设计使BLE设

qq_43399763的博客 1929

告别CANoe?手把手教你用Python+PCAN搭建汽车诊断脚本(附完整代码)

本文详细介绍了如何利用Python和PCAN硬件搭建高性价比的汽车诊断自动化方案,替代昂贵的CANoe工具。通过开源库python-can和udsoncan实现UDS诊断协议,涵盖硬件选择、环境配置、核心功能实现及性能优化,附完整代码示例,助力开发者快速构建诊断脚本。

weixin_42551227的博客 373

【安卓开发】Android系统中Parcelable和Serializable的区别

进行Android开发的时候,我们都知道不能将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。 通过Android的API,我们知道有两种选择,即在传递对象时,需要对我们的对象进行 Parcelable 或者Serializable化。作为Java开发者,相信大家对Serializable 机制有一定了解,那为

MR CUI的专栏 1102

【分享】ArcGIS实现分子分母等标注实用技巧

前言 标注是显示在地图上的文字信息,是出图中不可或缺的重要元素,为了标注的样式丰富,摆放的位置灵活,因此给制图出图带来不少难度,以下分享几种本人在ArcGIS中的标注方法,实现上下标注、换行标注或分式标注的实用技巧。 普通模式与高级模式 默认为普通模式,勾选高级开启高级模式。 普通二分式标注(普通模式) [DLBM] & vbnewline & [DLMC] 标注效果展示 分行二分式标注(普通模式) [DLBM]& vbnewline & "——————" &

杨港 3万+

Android中 Parcelable 的应用,以及与 Serializable 的对比

在 Android 应用开发中,经常需要在 Activity 间传递参数,有时还需要传递 Java 对象。而传递对象有两种实现方式,一种是使类实现 android.os.Parcelable 接口,另外一种是使类实现 Serializaable 接口。

ToSimple的博客 184

E4A蓝牙APP开发实战:从零到一构建简易物联网控制终端

本文详细介绍了使用E4A(易安卓)开发蓝牙APP的实战教程,从零开始构建简易物联网控制终端。通过E4A的中文编程环境和内置蓝牙组件,开发者可以快速实现智能家居控制、创客项目遥控等功能。文章涵盖硬件准备、开发环境搭建、核心代码解析及典型应用场景,特别适合零Java基础的电子爱好者入门蓝牙APP开发。

weixin_42715608的博客 476

Claude Code 学习笔记之一:理解 Agentic Loop 与内置工具

本文介绍了Claude Code这一终端智能助手的工作原理与使用方式。作者从ABAP开发经验出发,指出学习Claude Code的高级用法具有长期价值。文章详细解析了Claude Code的Agentic Loop机制:通过大语言模型进行推理,借助各类工具执行任务,并循环收集上下文、执行操作、验证结果三个步骤。系统阐述了Claude Code支持的五大类工具及其扩展方式,说明了其访问本地资源的范围和自治处理能力,同时介绍了权限模式等安全机制。最后提供了从小任务开始、充分探索、及时引导、使用CLAUDE.md

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 547

Android——Parcelable和Serializable浅析

1. 简介 Parcelable是一个接口、用来实现序列化,Android特有的 与此类似的还有一个接口Serializable,这是JavaSE本身支持的,而Parcelable是android特有的。二者比较: 实现Parcelable就是为了进行序列化,那么,为什么要序列化? 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 1)永久性保存对象,保存对象的字节序列到本地文件中; 2)通过序列化对象

Yawn 639

基于Playwright和反爬虫规避技术的雪球股票讨论数据采集方案

随着量化投资和社交投资的兴起,雪球作为中国领先的投资社交平台,其用户讨论数据成为研究市场情绪的重要来源。本文将详细介绍如何使用最新的Playwright技术和反爬虫规避策略,构建一个高效、稳定的雪球股票讨论爬虫系统。本文详细介绍了基于Playwright的雪球股票讨论爬虫实现方案,涵盖了从基础配置到高级反爬虫策略的各个方面。AI驱动的反爬虫对抗更智能的请求调度算法区块链技术在数据溯源中的应用联邦学习在数据采集中的运用。

2201_76125261的博客 1010

android中 Serializable和Parcelable 的区别

Android开发中对象序列化主要有Serializable和Parcelable两种方式。Serializable是Java标准接口,通过反射实现,适合数据持久化和跨平台传输,但性能较低;Parcelable是Android特有接口,手动实现序列化逻辑,内存操作效率高,适合Activity间数据传递和IPC通信。Kotlin中可用@Parcelize简化实现。选择时需权衡性能需求和使用场景:内存高效传输用Parcelable,持久化存储用Serializable。

梦想不只是梦与想的博客 925

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

简析Java中的Serializable与Android中的Parcelable序列化

文章目录关于序列化Serializable简述原理怎么使用ParcelableParcelable的实现原理“包装公司”Parcel装包拆包两者的区别小结 关于序列化 这篇文章主要来讲一下在安卓中关于序列化的问题。首先了解一个问题:什么是序列化?为什么要用到序列化? 什么是序列化:序列化就是就是把一个对象变成可传输的二进制流,可以进行传输。 什么是反序列化:与序列化对应,反序列化就是把一个二进制...

一只修仙的猿 760

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android 中Kotlin实现Parcelable和Serializable

尽管Serializable更简单,但是为了app性能,最好还是用Parcelable。return 0:"":0> {分析:发现什么问题了吗?没错,Percelable的实现方式更复杂,Serializable只需实现一个接口就完成了,管他那么多,Serializable就完事了(这也是我至今都喜欢Serializable的原因)后面在阅读官方文档的时候,发现Percelable也有了简单的方式,而且官方也是推荐使用 Percelable,所以还是更改了使用习惯。

Mark Wu 的博客 1763

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: windows下使用cmake和ndk编译android所用动态库.so和静态库.a
下一篇: android sdk下载和更新 eclipse + ADT
zmscs
博客等级 码龄16年 6粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值