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

时间: 2024-10-15 01:23:49

Android中的Parcelable接口和Serializable用法和区别的相关文章

Android中的Parcelable接口

Android中的android.os.Parcelable接口用于替代Java序列化Serializable接口,Fragment以及Activtity之间都需要传递数据,有时甚至包含结构非常复杂的对象,这就需要先将这个对象序列化成二进制流,然后再进行传递了. 比如Fragment1向Fragment2传递数据,下面是Fragment1中创建Fragment2并传送数据的方法: Fragment2 fragment = new Fragment2(); Bundle bundle = new 

学习Android中的Parcelable接口

接触安桌不久,在之后很长的一段时间我将会一直在研究安桌开发.只是为了实现一下自己的想法. 1.首先要说parcelable之前必须要说一下,Serializable接口.看了很多教程,在说Activity数值传递的过程便是要先说Serializable接口,然后才是parvelable接口.两个接口相类似,有什么区别? Parcelable和Serializable的作用.效率.区别及选择: 1.作用 Serializable的作用是为了保存对象的属性到本地文件.数据库.网络流.rmi以方便数据

Android中adb push和adb install的使用区别

Android中adb push和adb install的使用区别  转载 本篇文章由史迎春(@三俗小女子)投稿.转载请注明原文地址. 在Android实际开发中,经常会使用adb命令,安装应用程序可以使用adb push 或者adb install.下面就来讲讲这两种安装方式的区别. adb push 能够指定安装目录.比如执行”adb push xxx.apk system/app” 后,xxx.apk被安装到了system/app目录下,此目录下的软件为上文中提到的system appli

android中libs目录下armeabi和armeabi-v7a的区别

在我们android APK的根目录有一个 libs文件夹,此文件夹下包含了armeabi 和armeabi-v7a两个文件夹,我们的c代码编译成的本地库(各种.so)就会放在这两个文件夹其中的一个.那armeabi-v7a 与 armeabi有什么区别,都是什么意思呢? armeabi和armeabi-v7a是表示cpu的类型,我们知道一般的手机或平板都是用arm的cpu(mips的就悲催的被忽视了),不同的cpu的特性不一样,armeabi就是针对普通的或旧的arm cpu,armeabi-

Android开发当中Parcelable接口的使用

对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的. Android序列化对象主要有两种方法,实现Serializable接口.或者实现Parcelable接口.实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在进程间通信(IPC)中.实现Serializable接口非常简单,声明一下就可以了.而实现Pa

Android中callback(接口回调)机制

事实上,callback 机制在Android 中无处不在,特别是以Handler.Callback.Listener这三个词结尾的,都是利用callback机制来实现的.比方点击事件onClickListener就是一个已经封装好的callback案例: tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub

当在类中的 Parcelable 接口使用 ArrayList &lt; customObject &gt; android 系统: nullPointerException

我想使调用音乐使用 parcelable,所以我可以访问两个不同的活动中的音乐的实例的类.我不想使用可序列化的速度的目的.当我尝试将它使用传递时,我总是收到 nullPointerException: Intent in = getIntent(); thisInstance = (Music) in.getExtras().get("MusicInstance"); 音乐班: (ArrayList 是在底部的顶部和 parcelable 类) public class Music i

Android中使用OnClickListener接口实现按钮点击的低级失误

今天写了几行极为简单的代码,就是想implements  View.OnCLickListener.然后实现按钮点击操作.但是按钮却没有反应,找了五分钟还是没有结果. 以下是我的代码,希望大家不要嘲笑: XML布局如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:la

android中必备的接口回调用法

1 ,这个方法很常见,本人觉得也很实用,分享下吧 public class DirverDistanceTool { public void getDirverDistance(LatLng start, LatLng end,final OnDirverDistanceListener onDirverDistanceListener) { RoutePlanSearch mSearch = RoutePlanSearch.newInstance(); mSearch.setOnGetRout