Android里为了提高序列化效率,提高了一个类似于java原生的Serializable的序列化接口——Parcelable。
下面就来详细说说这个Parcelable接口:
1.为什么要进行序列化?
1)永久性的保存对象,将对象序列化到文件中;
2)通过序列化对象在网络中传递数据;
3)通过序列化在进程中传递数据;
2.Android中实现序列化的方法
Android中实现序列化有两个选择:一是实现Serializable接口(是Java本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
注:Android中Intent传递对象有两种方法:一是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key,Object)。当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口。
3.选择序列化方法的原则
1)在内存中使用的时候,Parcelable比Serializable性能要高,推荐使用Parcelable;
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable
4.使用场景
import android.os.Parcel;
import android.os.Parcelable;
/**
* 实现Parcelable接口
*/
public class Entity implements Parcelable {
private int id;
private String name;
public Entity(int id, String name) {
this.id = id;
this.name = name;
}
public Entity(Parcel in) {
this.id = in.readInt();
this.name = in.readString();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//默认返回"0"就行
@Override
public int describeContents() {
return 0;
}
//将对象数据写入到Parcel对象中,如intent.putExtra("Parcel", entity)将调用
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
}
//定义Parcelable.Creator内部类,注意:类名只能为CREATOR,全大写,不能为小写 //或者其他名
//public static final 这些修饰符一个都不能少
public static final Parcelable.Creator<Entity> CREATOR= new Parcelable.Creator<Entity>() {
//反序列将调用该方法还原,如Entity entity = (Entity)intent.getPa //rcelableExtra("Parcel")将调用该方法
@Override
public Entity createFromParcel(Parcel source) {
return new Entity(source);
}
//默认返回new Entity[size]就行
@Override
public Entity[] newArray(int size) {
return new Entity[size];
}
};
}
2) 传递数据
![](http://dl2.iteye.com/upload/attachment/0108/1512/b2d437d9-d3d7-36fc-8ece-ed7ed6d9a81f.png)
3)获取数据
![](http://dl2.iteye.com/upload/attachment/0108/3315/06ef19aa-ad33-3610-b0e1-f4b10b509139.png)