两个接口的作用:
实现Parcelable就是为了进行序列化,android特有,高效:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。
同样,实现Serializable也是为了序列化,属于java特有,兼容性高:
1.可以提供一系列保存对象状态的方法网络发送;
2.文件储存对象状态;
3.管道发送对象给其他应用程序。
两者功能一致,对象,数组,线性表均可传输,但实现方式上有所区别。
Parcelable的实现:
1.首先需要传输类实现这个接口,Parcel就是一个存放读取数据的容器,利用这个容器进行操作。Parcel机制:本质上把它当成一个Serialize就可以了。只是Parcel的对象实在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此更加高效。
2.重写public void writeToParcel(Parcel dest, int flags)方法,其中dest.write()方法用于写入数据,其中对象使用
方法dest.writeParcelable()进行传递,传递的对象必须实现Parcelable的接口。
3.在构造函数中增加顺序读取的方法,注意必须于写入程序相对应。
4.实例化静态内部对象CREATOR实现接口Parcelable.Creator
以下是整个类的定义:
package com.example.parcelableserializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class MyParcelable implements Parcelable
{
private int integer1,integer2; //注意这个序列顺序
private String string;
private DataB objectb=new DataB();
private DataA objecta=new DataA();
private List<DataA> arraylist=new ArrayList<DataA>();
public MyParcelable()
{
}
public MyParcelable(Parcel parcle) //构造函数中进行数据读取,注意序列化
{
integer1=parcle.readInt();
string=parcle.readString();
integer2=parcle.readInt();
ClassLoader loader1=DataB.class.getClassLoader();
objectb=parcle.readParcelable(loader1); //参数是类的加载器
ClassLoader loader2=DataA.class.getClassLoader();
objecta=(DataA) parcle.readValue(loader2); //对象是object,需要进行类型强制转换
//获取数组的值
Parcelable[] myparcel=parcle.readParcelableArray(loader2);
DataA[] a=new DataA[myparcel.length];
List<Parcelable> par=Arrays.asList(myparcel);
DataA[] dataa=par.toArray(a);
arraylist=Arrays.asList(dataa);
}
@Override
public int describeContents() //内容描述,不用管
{
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) //关键的数据传递,写入接口打包
{
dest.writeInt(integer1);
dest.writeString(string);
dest.writeInt(integer2);
dest.writeParcelable(objectb, flags);
dest.writeValue(objecta);
DataA[] a=new DataA[arraylist.size()];
dest.writeParcelableArray(arraylist.toArray(a),flags); //将按a类型对arraylist进行类型转换。
}
//实例化静态内部对象CREATOR实现接口Parcelable.Creator
public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>()
{
public MyParcelable createFromParcel(Parcel in)
{
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size)
{
return new MyParcelable[size];
}
};
public void setinteger1(int inta)
{
integer1=inta;
}
public int getinteger1()
{
return integer1;
}
public void setinteger2(int inta)
{
integer2=inta;
}
public int getinteger2()
{
return integer2;
}
public void setString(String stringa)
{
string=stringa;
}
public String getstring()
{
return string;
}
public void setDataA(DataA data)
{
objecta=data;
}
public DataA getDataA()
{
return objecta;
}
public void setDataB(DataB data)
{
objectb=data;
}
public DataB getDataB()
{
return objectb;
}
public void setarraylist(List array)
{
arraylist=array;
}
public List getarraylist()
{
return arraylist;
}
}
MainActivity调用方法:
private MyParcelable mypar=new MyParcelable();
Intent intent=new Intent();
intent.setClass(this,TestActivity01.class);
intent.putExtra("mypar",mypar);
在TestActivity01中调用获取:
mypar=(MyParcelable) this.getIntent().getExtras().get("mypar");
Serializable的实现:
这只是给对象打了一个标记,系统会自动将其序列化,作用是将数据对象存入字节流当中,在需要时重新生成对象
import java.io.Serializable;
public class MySerializable implements Serializable
{
private static final long serialVersionUID = 1L; //序列id
private int data;
private String string;
public MySerializable()
{
}
public void setdata(int data)
{
this.data=data;
}
public int getdata()
{
return data;
}
public void setstring(String string)
{
this.string=string;
}
public String getstring()
{
return string;
}
}
调用方式与Parcelable基本一致:
private MySerializable myser=new MySerializable();
Intent intent=new Intent();
intent.setClass(this,TestActivity01.class);
intent.putExtra("myser",myser);
TestActivity01中调用
myser=(MySerializable) this.getIntent().getExtras().get("myser");