Android-Parcelable
Parcelable和Serializable的区别:
android自定义对象可序列化有两个选择一个是Serializable和Parcelable
一、对象为什么需要序列化
1.永久性保存对象,保存对象的字节序列到本地文件。
2.通过序列化对象在网络中传递对象。
3.通过序列化对象在进程间传递对象。
二、当对象需要被序列化时如何选择所使用的接口
1.在使用内存的时候Parcelable比Serializable的性能高。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。
3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。
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();
返回0;
写入接口函数,用来打包
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;
- }
- @Override
- public int describeContents() {
- // TODO Auto-generated method stub
- return 0;
- }
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // TODO Auto-generated method stub
- dest.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>() {
- @Override
- public Students createFromParcel(Parcel source) {
- // TODO Auto-generated method stub
- return new Students(source);
- }
- @Override
- public Students[] newArray(int size) {
- // TODO Auto-generated method stub
- return new Students[size];
- }
- };
- }
Android-Parcelable的更多相关文章
- Android Parcelable和Serializable的区别,androidparcelable
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...
- [Android]Parcelable encountered IOException writing serializable object (name = xxx)
Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...
- Android Parcelable理解与使用(对象序列化)
http://my.oschina.net/zhoulc/blog/172163 parcel定义介绍: android提供了一种新的类型:parcel(英文解释:包裹,小包),本类用来封装数据的容器 ...
- Android Parcelable和Serializable的区别
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...
- Android Parcelable using Kotlin
Kotlin 有 extension 可以很方便的让类继承 Parcelable 接口. 项目中引入一个较新版本的 Kotlin 引入 Kotlin extensions classpath &quo ...
- [转]Android Parcelable和Serializable的区别
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...
- Android Parcelable 源码解析
大家都知道,要想在Intent里面传递一些非基本类型的数据,有两种方式,一种实现Parcelable,另一种是实现Serializable接口. 今天先不说Serializable 接口,只说Parc ...
- Android Parcelable vs Serializable
序列化 在Android中.对象在实现序列化之前是无法直接作为Intent參数在Activity之间传递的. Android中对象序列化能够通过实现Serializable接口或者实现Parcelab ...
- Android Parcelable 序列化复杂数据结构
参考博文 http://blog.csdn.net/yangzl2008/article/details/7593226 由于项目需要,Activity之间要传递一个特别复杂的数据结构对象,由于以前序 ...
- Android Parcelable Trans byte[]
思路: http://stackoverflow.com/questions/10898116/make-custom-parcelable-containing-byte-array 谢谢, 这位外 ...
随机推荐
- C++获取当前目录
/* @author:CodingMengmeng @theme:C++获取当前目录 @time:2017-1-6 21:03:34 @blog:http://www.cnblogs.com/codi ...
- LINQ
lambda表达式: LINQ to Object: 参考:http://www.cnblogs.com/leon-y-liu/articles/3575009.html LINQ to XML: u ...
- python之线程进程协成
线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...
- 手把手教你玩转nginx负载均衡(五)----配置后端服务器组
引言 在前面几篇中,我们成功的搭建起了一台nginx服务器,所以我们要重复前面的步骤,把服务器的数量增加到3台以上,我这里已经建好了另外两台,分别是centos7-22,centos7-23,对应的i ...
- 使用 jsoup 对 HTML 文档进行解析和操作
jsoup 简介 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HT ...
- Chrome 桌面通知Notification
今天2016-11-18号,最新chrome版本:V50 在网上找了好久都用不了,因为chrome版本已经是V50了,chrome在V22版本之后就取消掉window.webkitNotificati ...
- 【Java EE 学习 82 下】【MAVEN整合Eclipse】【MAVEN的一些高级概念】
一.MAVEN整合Eclipse MAVEN是非常优秀,但是总是要开命令行敲命令是比较不爽的,我们已经习惯了使用IDE,所以还有一种将MAVEN整合到Eclipse的方法. 详情查看:http://w ...
- C 标准库系列之ctype.h
ctype.h 主要提供了一些函数用以测试字符或字符处理的功能函数:包括字符判断检测.字符转换: 目前ASCII字符可分为以下一些类型,如:大写.小写.字母.数字.十六进制.空白字符.可打印字符.控制 ...
- sublime Text 3 安装emmet
Emmet简介 Emmet是一个支持大部分流行文本编辑器的插件,能够极大得提高编写HTML和CSS的工作效率. 官网:http://emmet.io/ 在Sublime Text 3中安装 前提Sub ...
- 【CentOS】LAMP相关3
调优,安全如果是运维一个网站,PHP搭建的话,可能会出现500的错误,白页怎么去排查呢,今天就涉及到这方面的东西 http://blog.csdn.net/bsi_l4/article/details ...