前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android Activity间传值选择,Serializable Or Parcelable

Android Activity间传值选择,Serializable Or Parcelable

作者头像
三好码农
发布于 2018-09-11 02:55:47
发布于 2018-09-11 02:55:47
1.3K0
举报

  前言:Activity就是Android世界的controller,它们构成了Android App里面的每一个页面,当然我们还会使用Fragment来将页面进一步划分,通过Fragment可以对特定业务模块的View+逻辑封装,让其与Activity解耦,同时还可以有自己的生命周期,让我们控制布局绘制和进行资源回收,这些都是Fragment的好处,以后有机会再谈,今天,我们想讨论的是Activity页面之间跳转时,互相传值的方法选择。

  我们知道,像int,long,double等基本类型和String都可以直接使用Intent类提供的putExtra方法直接打包传递,但很多时候,我们要传递的可能是一个实体类的对象,要传递一个实体类对象,有二种办法,标记类实现Serializable接口 或者 添加代码实现Parcelable接口,注意的是Serializable接口没有任何实际方法需要实现,它只是一个标记,标记可以进行序列化。Serialiable是Java提供的序列化接口,它将对象按规则转化为字节队列,字节队列可以进行网络传输,这样可以让java的对象跨环境的进行传输,序列化只能序列化成员变量,而静态变量和方法不会被序列化,transient关键字修饰的变量也不会被序列化。Java中反序列化时通过SerialVersionUID来判断是否能够反序列化,所以需要序列化的类最好都能给出一个固定的SerialVersionUID值,如下

而Parcelable是Android提供的接口,它主要是通过writeToParcel(),将需要持久化的字段保存到一个Parcel对象里面,然后通过CREATOR

从Parcel对象中,取出相应的字段,完成对象的恢复,很明显这里Parcelable有它的优势,需要保存哪些字段我们可以自由控制,因为写接口暴露给我们了,需要恢复哪些字段,我们同样可以控制,所以相对于Serializable,存储的代价小很多,因为Serializable需要保存很多额外的字段来保证反序列化能够成功。

    现在我们还是通过一个具体的实例来介绍这二种Activity传值的基本使用方法。假设,我们现在有一个商品Good的列表,Good类是这样的

第一个需求是点击列表的一个cell,跳转到Good的详情页,即我们需要将点击对应的Good对象传递到详情Activity。第二个需求是点击任何一个cell,将全部的Good信息传递到详情Activity,即传递一个Good数组。

我们先来看第一个需求,先用Serializable的方法,发送很简单

接收对象也很简单

我们再来使用Parcelable接口来传递,先定义一个类ParcelableGood

发送数据也很简单

接收也同样类似

第一个需求很简单就搞定了,我们再来搞定第二个需求,传Good的数组给详情Activity,如果使用Serializable的话,Intent没有提供putExtra直接传递Good数组的重载方法,所以我们需要做一个包装类,我新建一个WrapGood类如图

这样就可以直接传递一个WrapGood,间接达到传递Good数组的目的,

接收数据

因为Intent提供了putExtra方法直接传递Parcelable数组的重载,所以可以直接使用,

从Intent中取出Parcelable数组更简单

  现在为止Good里面的属性都是基本类型或者String,当然它的属性也可以是另外一个实体类,假设是GoodExtra类,这个时候如果要用Serializable序列化,GoodExtra也必须要标记Serializable接口。如果要使用Parcelable,GoodExtra同样要实现我们上面介绍的writeToParcel 和 CREATOR。

  最后我们来做一个总结,上面已经介绍了在Android开发中Serializable和Parcelable的用法,我们推荐使用Parcelable,理由大致有3个:1.Parcelable是Android 框架提供给我使用的,Google提供了比较好的接口和文档支持,例如上面的putExtra,就有对Parcelable数组的重载方法。2. Parcelable效率更高,Parcelable底层实现是内存的copy,速度很快,Serializable是IO操作,而且会用到反射,相对比较慢,国外有人测试过,Parcelable比Serializable从序列化到传输到反序列化,平均要快10倍左右。3.最后一个原因也是最重要的原因,Parcelable要序列化哪些字段,我们完全可以控制,而且还可以在其中加入各种转换,修饰,因为写接口暴露给我们了,我们可以自由定制,而Serializable就显的比较笨拙,而且需要一些额外的字节来存储类的信息,当然Serializable使用起来要更简单。这些都是它们在理论上的比较,项目中绝大多数场景,二者都可以完全胜任,具体用哪个,见仁见智吧~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015.04.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Activity间数据传递方法汇总
在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递。 一、常用数据类型 在前面几节我们只学习了一些常用类型的数据传递,主要是以下这些重载方法: putExtra(String name, boolean value) putExtra(String name, byte value) putExtra(String name, char value) putExtra(String name, short
分享达人秀
2018/03/26
1K0
Android 进阶6:两种序列化方式 Serializable 和 Parcelable
张拭心 shixinzhang
2018/01/05
1.6K0
Android 进阶6:两种序列化方式 Serializable 和 Parcelable
Android Parcelable
      Paracelable是android自己的实现序列化的接口,是anroid推荐使用的.那么什么事序列化呢?简单来说就是将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 ,那反序列化就是从二进制流(序列)转化为对象的过程
android_薛之涛
2018/09/12
6210
Android  Parcelable
Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android中进程间通信是比较难的一部分,同时又非常重要,针对进程间通信,博主会用四篇文章来介绍,本篇文章为IPC系列的开篇,主要介绍一些IPC中用到的一些概念、基础等,目的是让读者朋友们在学习IPC之前对一些必要的知识有一个大体的把握。在Android中进程间通讯的方式有很多种,在后续的三篇中会分别介绍每一种方式的实现过程已经各自的优缺点。 IPC是什么? I
codingblock
2018/03/30
6180
必读!Android序列化权威面试指南,资深面试者的秘诀
在Android开发中,Serializable与Parcelable是两种用于实现对象序列化的常见方式。在面试中,对于这两种技术的理解和应用能力常常被用来评估一个Android开发者的水平。本文将围绕Serializable与Parcelable展开一系列高级疑难的面试问题,并深入探讨它们的原理、优劣势以及实际应用中的技巧。
Rouse
2024/03/06
1630
必读!Android序列化权威面试指南,资深面试者的秘诀
Serializable和Parcelable的再次回忆
自己开发Android也有些时间了,Serializable和Parcelable遇到过不止一次了。但是每次别人问起具体的内容自己偏偏记得不是很清晰。因为某些原因再次梳理一下,以文章的形式给自己存储下来。温故而知新!!
静默加载
2020/05/31
6050
Android进程间通信(一):基础介绍
进程间通信 即 IPC机制,IPC 全称为 Inter-Process Communication。
103style
2022/12/19
3130
彻底理解Serializable和Parcelable
这里有二个关键字,存储和传输,存储的场景比如对象的持久化,传输的场景比如将对象通过网络传输,然后在需要使用的时候,反序列化,重新创建对象。
三好码农
2019/03/15
1.2K0
Android开发之漫漫长途 X——Android序列化
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。
LoveWFan
2018/08/07
3930
如何优雅地进行序列化操作
需要使用Gson或者Fastjson第三方的库,将对象转化为json数据。 我在这里使用Gson做示范。
猴哥yuri
2018/08/16
5150
Android开发笔记(二十七)对象序列化
程序中存储和传递信息,需要有个合适的数据结构,最简单的是定义几个变量,变量多了之后再分门别类,便成了聚合若干变量的对象。代码在函数调用时可以直接传递对象,但更多的场合例如与文件交互、与网络交互、组件之间交互等等,就无法直接使用未经处理的对象。因此Java引入了序列化的概念,用于把一个对象转换为字节序列,然后再对这个字节序列做存储和传递操作。与之对应的是反序列化,反序列化是把一个字节序列恢复为Java对象的过程,而序列化是把Java对象转化为字节序列的过程。
aqi00
2019/01/18
6570
Android十八章:多进程基础
这一章主要讲述多进程的作用,序列化和反序列化,Serializable和Parcelable
ppjun
2018/09/05
4700
Android技能树 — 多进程相关小结
这次是讲Android存储路径及IO的基本操作。因为我们在开发的时候会经常这种方便的需求。这篇文章的内容我写的可能很少,都没有细写。别吐槽。o( ̄︶ ̄)o
青蛙要fly
2018/08/29
4520
Android技能树 — 多进程相关小结
Android序列化总结
公园里,一位仙风鹤骨的老者在打太极,一招一式都仙气十足,一个年轻人走过去:“大爷,太极这玩意儿花拳绣腿,你练它干啥?”老者淡淡一笑:“年轻人,你还没有领悟到太极的真谛,这样,你用最大力气打我试试。”于是年轻人用力打了老头一拳,被讹了八万六。
大公爵
2018/09/05
8360
Android序列化总结
漫谈序列化—使用、原理、问题
说到对象,是一个比较宽泛的概念,简单的说,他就是类的一个实例,有状态和行为,存活在内存中,一旦JVM停止运行,对象的状态也会丢失。
码上积木
2021/02/08
8910
android之Parcelable介绍
Parcelable类的概述在SDK中是这样的:这些类的接口可以将实例写入或从中还原 Parcel。
李小白是一只喵
2020/12/31
6530
Android 反序列化漏洞攻防史话
Java 在历史上出现过许多反序列化的漏洞,但大部分出自 J2EE 的组件。即便是 FastJSON 这种漏洞,似乎也很少看到在 Android 中被实际的触发和利用。本文即为对历史上曾出现过的 Android Java 反序列化漏洞的分析和研究记录。
evilpan
2023/03/27
1.9K0
Android 反序列化漏洞攻防史话
Android中的序列化:Parcelable和Serializable
概述 序列化:将一个对象转换成 可存储或 可传输的状态。 Parcelable和Serializable的区别 作用 Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。 Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。 性能比
用户1205080
2018/12/21
7870
Android入门之数据传递
Intent数据传递 List 传递List传递List的方法 ArrayList<String> info = new ArrayList<String>(); info.add(name); info.add(website); info.add(weibo); Intent intent = new Intent(MainActivity.this, ResultActivity.class); intent.putStringArrayListExtra("infoList"
xiangzhihong
2018/02/06
8610
Parcelable与Serializable
由于 Java 的 Serializable 的性能较低,Parcelable 正式在这个背景下产生的,它核心作用就是为了解决 Android 中大量跨进程通信的性能问题。
老马的编程之旅
2022/06/22
1.2K0
相关推荐
Activity间数据传递方法汇总
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档