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




原文地址:https://www.cnblogs.com/zhchoutai/p/7110815.html