2019独角兽企业重金招聘Python工程师标准>>>

parcel定义介绍:

android提供了一种新的类型:parcel(英文解释:包裹,小包),本类用来封装数据的容器,封装后的数据可以通过Intent或IPC传递,除了基本类型外,只有实现了Parcelable接口的类才能放入parcel中。

parcel一般都用在Binder通信,通过read和write方法进行客户端与服务端的数据传递(通信)。
        比如:frameworks层服务端与hardware客户端的Binder通信
                reply->writeInt32(getCardReaderSize());
                int mid = data.readInt32();
    用来存放parcel数据的是内存(RAM),而不是永远介质(Nand等)。

parcelable定义了把数据写入parcel和从parcel读出数据的接口,一个类的实例,如果需要封装到消息中去,就必须实现这一接口,如果实现了这个接口,该类的实例就是可以“被打包”。

Parcelable的定义:

下面我们看下parcelable的源码:
    
    内容描述接口,没什么作用
    public int describeContents();
    写入接口函数,用来打包
    public void writeToParcel(Parcel dest, int flags);
    读取接口,目的是从parcel中构造一个实现了parcelable的类的实例对象,因为实现类这里是不可知的,所以需要用到模板的方法,继承类通过模板参数传入。
    为了能够实现模板参数的传入,定义了creator嵌入接口,内涵两个接入函数分别是单个和多个继承类实例。
    public interface Creator<T> {
         public T createFromParcel(Parcel source);
         public T[] newArray(int size);
    }
    还有一个子接口继承Creator,子接口只提供了一个函数,返回单个继承类实例
    public interface ClassLoaderCreator<T> extends Creator<T>

Parcelable的实现使用:  

Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

package com.zlc.provider;import android.os.Parcel;
import android.os.Parcelable;public class Students implements Parcelable{private int stu_id;private String stu_name;public Students(Parcel source){stu_id = source.readInt();stu_name = source.readString();}public int getStu_id() {return stu_id;}public void setStu_id(int stu_id) {this.stu_id = stu_id;}public String getStu_name() {return stu_name;}public void setStu_name(String stu_name) {this.stu_name = stu_name;}@Overridepublic int describeContents() {// TODO Auto-generated method stubreturn 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {// TODO Auto-generated method stubdest.writeInt(stu_id);dest.writeString(stu_name);}//Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel. public final static Parcelable.Creator<Students> CREATOR = new Parcelable.Creator<Students>() {@Overridepublic Students createFromParcel(Parcel source) {// TODO Auto-generated method stubreturn new Students(source);}@Overridepublic Students[] newArray(int size) {// TODO Auto-generated method stubreturn new Students[size];}};
}

Parcelable和Serializable的区别:

android自定义对象可序列化有两个选择一个是Serializable和Parcelable

一、对象为什么需要序列化
        1.永久性保存对象,保存对象的字节序列到本地文件。
        2.通过序列化对象在网络中传递对象。
        3.通过序列化对象在进程间传递对象。

二、当对象需要被序列化时如何选择所使用的接口
        1.在使用内存的时候Parcelable比Serializable的性能高。
        2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。
        3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。

转载于:https://my.oschina.net/zhoulc/blog/172163

Android-Parcelable理解与使用(对象序列化)相关推荐

  1. android对象序列化的方法,Android 进阶-两种序列化方式 Serializable 和 Parcelable

    [导读]序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态 ...

  2. android parcelable 对象,Android实现Parcelable对象序列化的实例

    Android实现Parcelable对象序列化的实例 bundle.putParcelable可以实现传递对象,但是这个对象的类必须实现Parcelable接口才能够使用. 下面是一个简单的在Act ...

  3. Android开发笔记(二十七)对象序列化

    什么是序列化 程序中存储和传递信息,需要有个合适的数据结构,最简单的是定义几个变量,变量多了之后再分门别类,便成了聚合若干变量的对象.代码在函数调用时可以直接传递对象,但更多的场合例如与文件交互.与网 ...

  4. android 序列化存储对象,android中对象序列化存储

    项目中要存储一些数据为了提高不必要的网络请求,提高效率,用到数据持久化的知识点,针对这个问题,解决办法其实有很多,以前在项目中是服务获取到webservice的xml,然后直接将xml保存在本地,之后 ...

  5. android对象序列化,Android序列化总结

    前言 公园里,一位仙风鹤骨的老者在打太极,一招一式都仙气十足,一个年轻人走过去:"大爷,太极这玩意儿花拳绣腿,你练它干啥?"老者淡淡一笑:"年轻人,你还没有领悟到太极的真 ...

  6. 深入理解Java对象序列化

    关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...

  7. 理解Java对象序列化

    理解Java对象序列化 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在 ...

  8. java对象序列化作用_Java学习之——理解对象序列化

    Java的对象序列化就是把对象写入到输出流中,用来存储或传输:反序列化就是从输入流中读取对象.简单的来说是指将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 ...

  9. 对象序列化机制的理解

    1.对象的序列化机制: 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点. //当其它程序获取了 ...

  10. 理解Java对象序列化——Serializable接口

    概述:当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以. ...

最新文章

  1. 2010年的退休畅想
  2. 推荐7个圣经级技术号!第3名是我遇到的第1个开保时捷的前码农!
  3. java判断总共天数_Java判断两个日期相差天数的方法
  4. 莫队+带修莫队模板与总结
  5. ML之GB:GB算法相关论文、相关思路、关键步骤、代码实现、配图集合、案例应用之详细攻略
  6. linux运行脚本文件python,Python脚本:Linux自动化执行Python脚本
  7. 相对熵(relative entropy或 Kullback-Leibler divergence,KL距离)的java实现(三)
  8. mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...
  9. GROUP BY,WHERE,HAVING之间的差别和使用方法
  10. “ +”(加号)CSS选择器是什么意思?
  11. hadoop集群安装配置
  12. Linux设备驱动入门
  13. 教你如何将 优酷网等视频网站的视频外链时自动播放
  14. 人工智能的发展趋势分析
  15. seq to seq
  16. Android studio 安装步骤
  17. 同一局域网内的其他电脑访问我的电脑本地的网站
  18. ubuntu的一些安装设置
  19. 一元夺宝--夺宝模块 开发笔记(一)
  20. 浅析MOS管串联并联的驱动应用

热门文章

  1. jquery 文字轮播
  2. Windows server 2016 / Windows 10关于域管理员帐号权限不足的问题
  3. 【转】一些linux基础命令
  4. 项目回顾-RecyclerView和CheckBox错乱问题
  5. c# 计算时间间隔的方法(转)
  6. 对抗生成网络(Generative Adversarial Network, GAN)
  7. Coding Interview Guide -- 判断二叉树是否为平衡二叉树
  8. Data Services Designer将数据从sql server抽取到hana
  9. Windows10下安装MySQL8.0
  10. 对数组名取地址a和 数组首地址a