Parcelable比Serializable快10倍以上!
- Serializable的优点在于,只需要在类及其子类上实现Serializable接口。这是一个标记接口,这意味着没有实现方法,Java会尽最大努力有效地序列化它。这种方法的问题在于使用了反射,这是一个缓慢的过程。这种机制还倾向于创建许多临时对象,并导致大量垃圾回收。
- Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。Parcelable是Android提供的序列化的接口。实现过程主要分为序列化,反序列化,描述三个过程。
- Parcel提供了一套机制,可以将序列化之后的数据写入到一个共享内存中,其他进程通过Parcel可以从这块共享内存中读出字节流。可能会因为程序关闭或其他原因导致内存被回收而丢失的数据。
public class StartActivityInfo implements Parcelable {
private String sourcePage;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(sourcePage);
}
public static final Creator<StartActivityInfo> CREATOR = new Creator<StartActivityInfo>() {
@Override
public StartActivityInfo createFromParcel(Parcel in) {
return new StartActivityInfo(in);
}
@Override
public StartActivityInfo[] newArray(int size) {
return new StartActivityInfo[size];
}
};
private StartActivityInfo(Parcel in) {
sourcePage = in.readString();
}
public StartActivityInfo(String sourcePage) {
this.sourcePage = sourcePage;
}
public String getSourcePage(){
return sourcePage;
}
}
序列化
我们通过writeToParcel方法实现序列化,writeToParcel返回了Parcel,所以我们可以直接调用Parcel中的write方法,基本的write方法都有,对象和集合比较特殊下面单独讲,基本的数据类型除了boolean其他都有,Boolean可以使用int或byte存储
反序列化
CREATOR,必须有的一个非空的静态变量 。
描述
其中describeContents就是负责文件描述.通过源码的描述可以看出,只针对一些特殊的需要描述信息的对象,需要返回1,其他情况返回0就可以
数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化????
网友评论