博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Parcelable和Serializable的区别,androidparcelable
阅读量:6704 次
发布时间:2019-06-25

本文共 2289 字,大约阅读时间需要 7 分钟。

本文主要介绍Parcelable和Serializable的作用、效率、区别及选择,关于Serializable的介绍见Java 序列化的高级认识。

 

1、作用

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

从上面的设计上我们就可以看出优劣了。

 

2、效率及选择

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如 activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为 android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

 

3、编程实现

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

Parcelable的一个实现例子如下

1 public class MyParcelable implements Parcelable {   2      private int mData;   3      private String mStr;   4    5      public int describeContents() {   6          return 0;   7      }   8    9      // 写数据进行保存  10      public void writeToParcel(Parcel out, int flags) {  11          out.writeInt(mData);  12          out.writeString(mStr);  13      }  14   15      // 用来创建自定义的Parcelable的对象  16      public static final Parcelable.Creator
CREATOR 17 = new Parcelable.Creator
() { 18 public MyParcelable createFromParcel(Parcel in) { 19 return new MyParcelable(in); 20 } 21 22 public MyParcelable[] newArray(int size) { 23 return new MyParcelable[size]; 24 } 25 }; 26 27 // 读数据进行恢复 28 private MyParcelable(Parcel in) { 29 mData = in.readInt(); 30 mStr = in.readString(); 31 } 32 }

 

 

从上面我们可以看出Parcel的写入和读出顺序是一致的。如果元素是list读出时需要先new一个ArrayList传入,否则会报空指针异常。如下:

list = new ArrayList
();in.readStringList(list);

PS: 在自己使用时,read数据时误将前面int数据当作long读出,结果后面的顺序错乱,报如下异常,当类字段较多时务必保持写入和读取的类型及顺序一致。

11-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4126ed60: Unmarshalling unknown type code 3014773 at offset 164

 

4、高级功能上

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

 

其他:

android.os.BadParcelableException: ClassNotFoundException when unmarshalling

 

参考:

http://developer.android.com/reference/android/os/Parcelable.html

转载地址:http://mrflo.baihongyu.com/

你可能感兴趣的文章
二叉搜索树转换为有序双向链表
查看>>
jQuery选择器大全
查看>>
Oracle 视图及视图更新
查看>>
在计算机 . 上没有找到服务 WAS
查看>>
JAVA-基础(三大特性)
查看>>
[BZOJ] 1563: [NOI2009]诗人小G
查看>>
26. Remove Duplicates from Sorted Array
查看>>
mysql5.7.16安装 初始密码获取及密码重置
查看>>
java之代理 静态代理和动态代理
查看>>
springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用...
查看>>
黑马程序员--集合框架【3】
查看>>
Android -- 实现RecyclerView可拖拽Item
查看>>
[软考]之树与二叉树的遍历 ...
查看>>
运算符重载详解
查看>>
K-means算法应用:图片压缩
查看>>
python ----内置函数
查看>>
【洛谷4313】 文理分科(最小割)
查看>>
云服务器 linux文件系统异常an error occurren during the file system check导致服务器启动失败...
查看>>
Linux实战教学笔记07:Linux系统目录结构介绍
查看>>
创建博客的第一天
查看>>