Android中的Parcelable接口和Serializable用法和区别

Posted tuke_tuke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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接口非常简单,声明一下就可以了,而实现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 中的 Parcelable 和继承

Android中Parcelable接口用法

Android中Parcelable接口用法

Android中Parcelable接口用法

Android调用远程Service的参数和返回值都需要实现Parcelable接口

(转)Android中Parcelable接口用法