Android中的Parcelable接口和Serializable使用方法和差别
Parcelable接口:
Interface for classes whose instances can be written to and restored from a Parcel。 Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator
interface
类的实例能被写到和被存储到一个包裹里的接口。实现Parcelable 接口的类也必须有一个静态变量CREATOR,这个静态变量是一个实现 Parcelable.Creator接口的对象
序列化的原因和优点:
1,通过序列化对象在网络中传递对象;,
2。通过序列化在进程间传递对象。
实现序列化的两种方法:
一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能。效率比实现Serializable接口高效。可用于Intent数据传递,也能够用于进程间通信(IPC))。
实现Serializable接口很easy,声明一下就能够了,而实现Parcelable接口略微复杂一些,但效率更高,推荐用这样的方法提高性能。
注:Android中Intent传递对象有两种方法:一是Bundle.putSerializable(Key,Object),还有一种是Bundle.putParcelable(Key。Object)。当然这些Object是有一定的条件的。前者是实现了Serializable接口,而后者是实现了Parcelable接口。
Parcelable接口的定义:
public interface 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);
}
}
实现Parcelable步骤:
1)implements Parcelable
2)重写writeToParcel方法。将你的对象序列化为一个Parcel对象。即:将类的数据写入外部提供的Parcel中,打包须要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据
3)重写describeContents方法。内容接口描写叙述,默认返回0就能够
4)实例化静态内部对象CREATOR实现接口Parcelable.Creator
public static final Parcelable.Creator<T> CREATOR
实现Parcelable内部接口Creator的对象,必须实现两个方法:
注:当中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须所有大写。需重写本接口中的两个方法:createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值。封装成Parcelable对象返回逻辑层,newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话就可以(return
new T[size])。供外部类反序列化本类数组使用。
总之:通过writeToParcel将你的对象映射成Parcel对象。再通过createFromParcel将Parcel对象映射成你的对象。
也能够将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,仅仅只是这个过程须要你来实现。因此写的顺序和读的顺序必须一致。
代码:
1,实现Parcelable接口
package com.hust.bean; import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable; public class Book implements Parcelable {//实现Parcelable接口
/*
* book属性
* */
private String Title=""; //标题
private Bitmap Cover; //封面
private String Author=""; //作者
private String Publisher=""; //出版社
private String PublishDate="";//出版日期
private String ISBN=""; //ISBN
private String Summary=""; //简单介绍
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
//写到parcel中
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(Title);
dest.writeParcelable(Cover, flags);
dest.writeString(Author);
dest.writeString(Publisher);
dest.writeString(PublishDate);
dest.writeString(ISBN);
dest.writeString(Summary); }
//必须实例化Parcelable的内部接口Creator,一个字都不能变
public static final Parcelable.Creator<Book> CREATOR=new Creator<Book>(){
//从Pacel容器中读出来
@Override
public Book createFromParcel(Parcel source) {
// TODO Auto-generated method stub
Book book=new Book();
book.Title=source.readString();
book.Cover=source.readParcelable(Bitmap.class.getClassLoader());
book.Author=source.readString();
book.Publisher=source.readString();
book.PublishDate=source.readString();
book.ISBN=source.readString();
book.Summary=source.readString();
return book;
} @Override
public Book[] newArray(int size) {
// TODO Auto-generated method stub
return new Book[size];
} };
public String getTitle() {
return Title;
} public void setTitle(String title) {
Title = title;
} public Bitmap getCover() {
return Cover;
} public void setCover(Bitmap cover) {
Cover = cover;
} public String getAuthor() {
return Author;
} public void setAuthor(String author) {
Author = author;
} public String getPublisher() {
return Publisher;
} public void setPublisher(String publisher) {
Publisher = publisher;
} public String getPublishDate() {
return PublishDate;
} public void setPublishDate(String publishDate) {
PublishDate = publishDate;
} public String getISBN() {
return ISBN;
} public void setISBN(String iSBN) {
ISBN = iSBN;
} public String getSummary() {
return Summary;
} public void setSummary(String summary) {
Summary = summary;
} }
2。实现Serializable接口
public class Person implements Serializable
{
private static final long serialVersionUID = -7060210544600464481L;
private String name;
private int age; public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public int getAge()
{
return age;
} public void setAge(int age)
{
this.age = age;
}
}
Serializable实现与Parcelabel实现的差别
1)Serializable的实现,仅仅须要implements Serializable 就可以。这仅仅是给对象打了一个标记,系统会自己主动将其序列化。
2)Parcelabel的实现,不仅须要implements Parcelabel,还须要在类中加入一个静态成员变量CREATOR,这个变量须要实现 Parcelable.Creator 接口。
參考:http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html
Android中的Parcelable接口和Serializable使用方法和差别的更多相关文章
- android中的坐标系以及获取坐标的方法
android中有两种坐标系,分别称之为Android坐标系和视图坐标系.而对应的也有一些相关的方法可以获取坐标系中的 坐标值.只有搞清楚这些区别,才能在实现的时候不至于出错或者得不到你想要的效果. ...
- android中Bitmap的放大和缩小的方法
android中Bitmap的放大和缩小的方法 时间 2013-06-20 19:02:34 CSDN博客原文 http://blog.csdn.net/ada168855/article/det ...
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...
- [转]Android中Intent传递对象的两种方法(Serializable,Parcelable)
http://blog.csdn.net/xyz_lmn/article/details/5908355 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种 ...
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
[转][原文] 大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object); ...
- Android中使用Parcelable
今天 在两个Activity之间传集合类型数据,看了一下,要用Parcelable 所以就看一下东西: 下面一段话是复制网友的. Android序列化对象主要有两种方法,实现Serializable接 ...
- Android开发当中Parcelable接口的使用
本文转载于:http://www.2cto.com/kf/201205/132814.html 本文稍微做了些修改 android提供了一种新的类型:Parcel.本类被用作封装数据的容器,封装后的数 ...
- Android中callback(接口回调)机制
事实上,callback 机制在Android 中无处不在,特别是以Handler.Callback.Listener这三个词结尾的,都是利用callback机制来实现的.比方点击事件onClickL ...
- Android中的广播基本实现及回调方法的理解
在Android中broadcast这一节的内容其实不算多主要是牵扯到一个broadcastreceiver类,这个类是一个抽象类,下面有一个抽象方法onreceiver(),可以再我们收到网络状态变 ...
随机推荐
- How Javascript works (Javascript工作原理) (十一) 渲染引擎及性能优化小技巧
个人总结:读完这篇文章需要20分钟,这篇文章主要讲解了浏览器中引擎的渲染机制. DOMtree ----| |----> RenderTree CSSOMtree ----| ...
- javaScript学习之正则表达式初探
正则表达式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符 ...
- 洛谷 P1716 双调序列
P1716 双调序列 题目描述 电脑组的童鞋们经常玩一些智力PK小游戏,某月某日,发源于小朋友又发明了一种新的序列:双调序列,所谓的双调呢主要是满足如下条件描述: 假定有n(n<=1000)个整 ...
- C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符
1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...
- IOCP模型总结(总结回想)
IOCP旧代码重提.近期一直在玩其它方面的东东.时不时回想一下,收益多多. IOCP(I/O Completion Port,I/O完毕port)是性能最好的一种I/O模型.它是应用程序使用线程池处理 ...
- 游戏server之server优化思路
本文仅仅是提供一些游戏server优化思路,当中一些思路是用在不同场合的,不是同个架构的.须要依据应用场景选用合适方式. 本文的引用的文章都是在自己写的在本博客内的.也都是上线开几百个服的成熟项目的. ...
- Repeater控件的
http://blog.csdn.net/zhang_xinxiu/article/details/21872433 想起来,公司的aspx页面前台数据展示除了datagrid以为还有Repeater ...
- 【canvas】跟随鼠标的星空连线
2019-01-23 19:57:38 挂一个比较简单的一个canvas应用,利用CPU进行粒子实时计算,直接面向过程写的 帧动画:浏览器在下一个动画帧安排一次网页重绘, requestAnimat ...
- axel---下载工具
axel是Linux下一个不错的HTTP/ftp高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国内VP ...
- 将字符串使用md5加密
>>> import md5 >>> md5.md5('123').hexdigest() '202cb962ac59075b964b07152d234b70' & ...