Android 开发中 Parcelable 接口是如何实现序列化的?

本贴最后更新于 3184 天前,其中的信息可能已经时移世易

在 Android 开发中,我们会遇到各种各样情况,比如如何将对象保存在本地磁盘或网络上传输等。其实,实现序列化的方式有两种方式,分别是实现 Serializable 接口和实现 Parcelable,今天小编和大家介绍的就是 Android 序列化中 Parcelable 接口的使用。

Serializable 接口与 Parcelable 接口的区别
在将 Parcelable 接口的使用前,我们先来看看 Serializable 接口和 Parcelable 接口有什么区别:
1、Serializable 是 JDK 提供的接口,而 Parcelable 是 Android SDK 提供的。

2、Serializable 序列化是基于磁盘的,而 Parcelable 是基于内存的。在内存中读写的效率要高于磁盘,所以 Android 中跨进程传递对象都是使用 Parcelable。

Parcelable 接口定义
public interface Parcelable {
//内容描述接口,基本不用管
public int describeContents();
//写入接口函数,打包
public void writeToParcel(Parcel dest, int flags);
//读取接口,目的是要从 Parcel 中构造一个实现了 Parcelable 的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
//为了能够实现模板参数的传入,这里定义 Creator 嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
public interface Creator {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
从 parcelable 接口定义中,我们可以看出,实现 parcelable 接口,我们需要实现下面几个方法:
1.describeContents 方法。内容接口描述,默认返回 0 就可以;
2.writeToParcel 方法。该方法将类的数据写入外部提供的 Parcel 中。即打包需要传递的数据到 Parcel 容器保存,以便从 parcel 容器获取数据,该方法声明如下:
writeToParcel (Parcel dest, int flags) 具体参数含义见 javadoc
3、静态的 Parcelable.Creator 接口,本接口有两个方法:
createFromParcel(Parcel in) 从 Parcel 容器中读取传递数据值,封装成 Parcelable 对象返回逻辑层。
newArray(int size) 创建一个类型为 T,长度为 size 的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

Parcelable 接口的使用
public class AppContent implements Serializable, Parcelable {
//应用名字
private String name;
//应用下载链接
private String url;
private int downloadPercent = 0;
private Status status = Status.PENDING;
public AppContent(String name, String url) {
this.name = name;
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

 public String getUrl() {
     return url;
}

 public void setUrl(String url) {
     this.url = url;
 }
 public int getDownloadPercent() {
    return downloadPercent;
 }
public void setDownloadPercent(int downloadPercent) {
    this.downloadPercent = downloadPercent;
 }
 public Status getStatus() {
     return status;
 }
 public void setStatus(Status status) {
     this.status = status;
}
 @Override
 public String toString() {
     return name;
 }
 @Override
 public int describeContents() {
     return 0;
 }
 //实现Parcel接口必须覆盖实现的方法
@Override
 public void writeToParcel(Parcel dest, int flags) {
     /*将AppContent的成员写入Parcel,
      * 注:Parcel中的数据是按顺序写入和读取的,即先被写入的就会先被读取出来
      */
     dest.writeString(name);
     dest.writeString(url);
     dest.writeInt(downloadPercent);
   dest.writeValue(status);
}
//该静态域是必须要有的,而且名字必须是CREATOR,否则会出错
public static final Parcelable.Creator<AppContent> CREATOR =
         new Parcelable.Creator<AppContent>() {
            @Override
             public AppContent createFromParcel(Parcel source) {
                 //从Parcel读取通过writeToParcel方法写入的AppContent的相关成员信息
                 String name = source.readString();
                String url = source.readString();
                 int downloadPercent = source.readInt();
                 Status status = (Status)source.readValue(new ClassLoader(){});
                 AppContent appContent = new AppContent(name, url);
                appContent.setDownloadPercent(downloadPercent);
                 appContent.setStatus(status);
                 //更加读取到的信息,创建返回Person对象
                 return appContent;
           }

             @Override
             public AppContent[] newArray(int size)
             {
                // TODO Auto-generated method stub
                 //返回AppContent对象数组
                 return new AppContent[size];
             }
         };

}
通过 Intent 进行传递:

1 Intent intent = new Intent(Constants.DOWNLOAD_MSG);
2 Bundle bundle = new Bundle();
3 bundle.putParcelable("appContent", appContent);
4 intent.putExtras(bundle);

以上就是 Android 开发中,序列化常用的 Parcelable 接口方法,遇到有类似问题的亲可尝试使用上述的方法进行解决。

相关文章:《安卓百度地图开发 so 文件引用失败怎么解决》 http://www.maiziedu.com/group/article/6573/

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 23 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 356 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 649 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 645 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖 • 2 关注
  • OnlyOffice
    4 引用 • 16 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 514 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 181 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    86 引用 • 896 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    130 引用 • 793 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    184 引用 • 461 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    28 引用 • 66 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 52 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 518 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 355 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • abitmean

    有点意思就行了

    29 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 407 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 437 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 560 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖