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使用方法和差别的更多相关文章

  1. android中的坐标系以及获取坐标的方法

    android中有两种坐标系,分别称之为Android坐标系和视图坐标系.而对应的也有一些相关的方法可以获取坐标系中的 坐标值.只有搞清楚这些区别,才能在实现的时候不至于出错或者得不到你想要的效果. ...

  2. android中Bitmap的放大和缩小的方法

    android中Bitmap的放大和缩小的方法 时间 2013-06-20 19:02:34  CSDN博客原文  http://blog.csdn.net/ada168855/article/det ...

  3. Android中Intent传递对象的两种方法(Serializable,Parcelable)

    今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...

  4. [转]Android中Intent传递对象的两种方法(Serializable,Parcelable)

    http://blog.csdn.net/xyz_lmn/article/details/5908355 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种 ...

  5. Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!

    [转][原文] 大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object); ...

  6. Android中使用Parcelable

    今天 在两个Activity之间传集合类型数据,看了一下,要用Parcelable 所以就看一下东西: 下面一段话是复制网友的. Android序列化对象主要有两种方法,实现Serializable接 ...

  7. Android开发当中Parcelable接口的使用

    本文转载于:http://www.2cto.com/kf/201205/132814.html 本文稍微做了些修改 android提供了一种新的类型:Parcel.本类被用作封装数据的容器,封装后的数 ...

  8. Android中callback(接口回调)机制

    事实上,callback 机制在Android 中无处不在,特别是以Handler.Callback.Listener这三个词结尾的,都是利用callback机制来实现的.比方点击事件onClickL ...

  9. Android中的广播基本实现及回调方法的理解

    在Android中broadcast这一节的内容其实不算多主要是牵扯到一个broadcastreceiver类,这个类是一个抽象类,下面有一个抽象方法onreceiver(),可以再我们收到网络状态变 ...

随机推荐

  1. POJ 2752 Seek the Name, Seek the Fame [kmp]

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17898   Ac ...

  2. 解决Tomcat catalina.out 不断成长导致档案过大的问题

    Tomcat的网站上的说法http://wiki.apache.org/tomcat/FAQ/Logging#Q6: System.out 和 System.err 都被打印到 catalina.ou ...

  3. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.1.介绍

    1 介绍 jqGrid for ASP.NET MVC 是一个服务端组件. 专为MVC    分隔 model ,view , controller 的原则,完全观察者模式 非常快的速度    仅仅很 ...

  4. 2821: 作诗(Poetize)

    2821: 作诗(Poetize) Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1078  Solved: 348[Submit][Status] ...

  5. wifi驱动总结(1)

    一.wifi平台设备驱动注册过程Path:Rtw_android.c (rk3399\kernel\drivers\net\wireless\rockchip_wlan\rtl8723au\os_de ...

  6. java多线程编程核心技术——第六章总结

    目录 1.0立即加载/"饿汉式" 2.0延迟加载/"懒汉式" 3.0使用静态内置类实现单例模式 4.0序列化与反序列化的单例模式实现 5.0使用static代码 ...

  7. Android Studio 2.0 Preview 4 的逆袭以及各种神注释

    Android Studio 2.0 Preview 4 的逆袭 一.Android Studio 2.0 Preview 4 AS2.0的改变非常大,今天刚装上,迫不及待的就来分享了,首先我们下载一 ...

  8. ansible配合shell脚本批量编译安装python3.6.6

    [root@node1:/etc]# tree /etc/ansible/ /etc/ansible/ ├── ansible.cfg ├── hosts ├── python.yml └── rol ...

  9. UnicodeEncodeError: &#39;latin-1&#39; codec can&#39;t encode characters in position 41-50: ordinal not in range(256)

    在处理标题或网址为中文的文件或网页的时候,报UnicodeEncodeError: 'latin-1' codec can't encode characters in position 41-50: ...

  10. 『Python』setup.py简介

    setup.py应用场合 网上见到其他人这样介绍: 假如我在本机开发一个程序,需要用到python的redis.mysql模块以及自己编写的redis_run.py模块.我怎么实现在服务器上去发布该系 ...