概述
Parcelable是Android中特有的序列化方式,它的实现比java的Serializable的实现较复杂一点:它需要重写describeContents和writeToParcel两个方法,以及Creator类型的CREATOR属性(其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。需要重写Creator接口中的两个方法:createFromParcel和newArray)
public class Album implements Parcelable {
/**
* 负责反序列化
*/
private static final Creator<Album> CREATOR = new Creator<Album>() {
/**
* 从序列化对象中,获取原始的对象
* @param source
* @return
*/
@Override
public Album createFromParcel(Parcel source) {
return new Album(source);
}
/**
* 创建指定长度的原始对象数组
* @param size
* @return
*/
@Override
public Album[] newArray(int size) {
return new Album[0];
}
};
/**
* 描述
* 返回的是内容的描述信息
* 只针对一些特殊的需要描述信息的对象,需要返回1,其他情况返回0就可以
*
* @return
*/
@Override
public int describeContents() {
return 0;
}
/**
* 序列化
*
* @param dest
* @param flags
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mId);
dest.writeString(mCoverPath);
dest.writeString(mDisplayName);
dest.writeLong(mCount);
}
}
原理
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,从而实现传递对象的功能。
对比
Serializable是Java的实现方式,可能会频繁的IO操作,反序列化通过反射实现,并且可能会产生较多的临时对象,所以消耗比较大,但是实现方式简单。
Parcelable是Android提供的方式,效率比较高,但是实现起来复杂一些。
二者的选取规则是:内存序列化上选择Parcelable, 存储到设备或者网络传输上选择Serializable(当然Parcelable也可以但是稍显复杂)
Serializable代码少,Parcelable代码多,实现略复杂
Serializable效率低,因为是通过流的形式进行传输的。Parcelable效率非常高,会将内容保存到内存中。
Serializable通过反射实现的,而Parcelable是通过自己实现的,效率会更高些。