在做开发的过程中,序列化是非常常见的。比如要将对象保存本地磁盘或者在网络上传输等。实现序列化有两种方式,一种是实现Serializable接口,第二种是实现Parcelable。

Serializable与Parcelable的区别

  1、Serializable是JDK提供的接口,而Parcelable是Android SDK提供的。

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

Parcelable接口定义

  1. public interface Parcelable {
  2. //内容描述接口,基本不用管
  3. public int describeContents();
  4. //写入接口函数,打包
  5. public void writeToParcel(Parcel dest, int flags);
  6. //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
  7. //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
  8. public interface Creator<T> {
  9. public T createFromParcel(Parcel source);
  10. public T[] newArray(int size);
  11. }

  从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的使用

  1. public class AppContent implements Serializable, Parcelable {
  2. //应用名字
  3. private String name;
  4. //应用下载链接
  5. private String url;
  6.  
  7. private int downloadPercent = 0;
  8.  
  9. private Status status = Status.PENDING;
  10.  
  11. public AppContent(String name, String url) {
  12. this.name = name;
  13. this.url = url;
  14. }
  15.  
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23.  
  24. public String getUrl() {
  25. return url;
  26. }
  27.  
  28. public void setUrl(String url) {
  29. this.url = url;
  30. }
  31.  
  32. public int getDownloadPercent() {
  33. return downloadPercent;
  34. }
  35.  
  36. public void setDownloadPercent(int downloadPercent) {
  37. this.downloadPercent = downloadPercent;
  38. }
  39.  
  40. public Status getStatus() {
  41. return status;
  42. }
  43.  
  44. public void setStatus(Status status) {
  45. this.status = status;
  46. }
  47.  
  48. @Override
  49. public String toString() {
  50. return name;
  51. }
  52.  
  53. @Override
  54. public int describeContents() {
  55. return 0;
  56. }
  57.  
  58. //实现Parcel接口必须覆盖实现的方法
  59. @Override
  60. public void writeToParcel(Parcel dest, int flags) {
  61. /*将AppContent的成员写入Parcel,
  62. * 注:Parcel中的数据是按顺序写入和读取的,即先被写入的就会先被读取出来
  63. */
  64. dest.writeString(name);
  65. dest.writeString(url);
  66. dest.writeInt(downloadPercent);
  67. dest.writeValue(status);
  68. }
  69.  
  70. //该静态域是必须要有的,而且名字必须是CREATOR,否则会出错
  71. public static final Parcelable.Creator<AppContent> CREATOR =
  72. new Parcelable.Creator<AppContent>() {
  73.  
  74. @Override
  75. public AppContent createFromParcel(Parcel source) {
  76. //从Parcel读取通过writeToParcel方法写入的AppContent的相关成员信息
  77. String name = source.readString();
  78. String url = source.readString();
  79. int downloadPercent = source.readInt();
  80. Status status = (Status)source.readValue(new ClassLoader(){});
  81. AppContent appContent = new AppContent(name, url);
  82. appContent.setDownloadPercent(downloadPercent);
  83. appContent.setStatus(status);
  84. //更加读取到的信息,创建返回Person对象
  85. return appContent;
  86. }
  87.  
  88. @Override
  89. public AppContent[] newArray(int size)
  90. {
  91. // TODO Auto-generated method stub
  92. //返回AppContent对象数组
  93. return new AppContent[size];
  94. }
  95. };
  96.  
  97. }

  通过Intent进行传递:

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

  参考:http://www.tuicool.com/articles/MJzAZn,感谢作者。

Android中Parcelable接口的使用的更多相关文章

  1. Android中Parcelable接口用法

    from: http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html Interface for classes wh ...

  2. Android中Parcelable接口

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...

  3. (转)Android中Parcelable接口用法

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...

  4. Android中Parcelable与Serializable接口用法

    转自: Android中Parcelable接口用法 1. Parcelable接口 Interface for classes whose instances can be written to a ...

  5. Android中的接口回调技术

    Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...

  6. Android中回调接口的使用

    MainActivity如下: package cn.testcallback; import android.os.Bundle; import android.app.Activity; /** ...

  7. Android中Parcelable和Serializable接口用法

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...

  8. Android开发中Parcelable接口的使用方法

    在网上看到很多Android初入门的童鞋都在问Parcelable接口的使用方法,小编参考了相关Android教程,看到里面介绍的序列化方法主要有两种分别是实现Serializable接口和实现Par ...

  9. Android 的Parcelable接口

    此文转载自http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html 1. Parcelable接口 Interface ...

随机推荐

  1. Cacti的基本使用

    对于Cacti是通过snmpget来获取数据,使用 RRDtool绘画图形,用snmp服务获取数据,然后用rrdtool储存和更新数据,那么就可以简单理解为Cacti就是RRDTool的一个web图形 ...

  2. DL4J (DeepLearning for java)

    http://deeplearning4j.org/lstm.html A Beginner’s Guide to Recurrent Networks and LSTMs Contents Feed ...

  3. nodeJS分层

    一.nodeJS分层 分为三层: - 表现层:接受用户数据,并封装 - 服务层:与公司业务有关的东西,处理判断呀什么的 - 持久层:与数据库有关的    表现层:page与表现层的数据传递,route ...

  4. Java 第十章 类和对象

    类和对象 类与对象的关系是什么? 答 :类是具有相同属性和方法的一组对象的集合. 类是抽象的,对象是具体的:类是对象的模版,对象是类的实例. 定义一个类的语法是什么? public class 类名{ ...

  5. java中this用法总结

    1,当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分. class Demo{ String str = "这是成员变量"; void fun(String ...

  6. 不用ide编译java程序时调用jar包

    调用特定目录下的jar包 javac -cp d:\javatest\dom4j.jar Dom4jDemo.java //这部分必须注意,d:\javatest 是Dom4jDemo.class所在 ...

  7. [SmartFoxServer入门]服务器安装

    安装SFS2X: SFS2X平台安装操作和步骤都很简单.我们建议先查看对系统的要求,然后根据你选择的操作系统按照指定的安装向导进行安装. 系统要求: SFS2X是一款支持所有主流操作系统,运行在JVM ...

  8. as的一些常见问题

    assets文件的存放目录在”src/main/”目录下,和java.res文件夹平级: aidl文件需要单独在”src/main/”目录下新建一个文件夹,然后创建对应的包名,将aidl文件放在包名对 ...

  9. 用c#开发微信 (6) 微渠道 - 推广渠道管理系统 1 基础架构搭建

    我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 本系统使用 ...

  10. 让Sqlite脱离VC++ Runtime独立运行

    前段时间在开发OrayTalk(傲瑞通)的聊天记录模块时用到了Sqlite,这是我第一次接触和使用Sqlite,总体感觉还是非常不错的.这里把我使用Sqlite的经验跟大家分享一下. 一.关于Sqli ...