Android中的Parcelable接口和Serializable使用方法和差别

时间:2022-09-24 21:20:38

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