序列化:Parcelable 和 Serializable
为了把对象的状态保存下来,存到磁盘中,会用到序列化
- 序列化:内存中的对象—>磁盘
- 反序列化:磁盘中的对象—>内存
1 Serializable
用serialVersionUID辅助,一个类对应一个serialVersionUID。反序列化时,先判断是否是当前类的对象,再决定是否可以反序列化。
实现简单,内存开销大。
import java.io.Serializable;
public class SerializableImplement implements Serializable {
/**
* 生成序列号标识
*/
private static final long serialVersionUID = -2083503801443301445L;
private int id;
private String name;
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;
}
}
2 Parcelable
为了解决Serializable内存开销大的问题,安卓提供了Parcelable。
Parcelable代码实现麻烦,但是内存开销小。
- 用writeToParcel方法,将对象映射成Parcel对象;
- 通过createFromParcel方法,将Parcel对象映射成我们的对象
import android.os.Parcel;
import android.os.Parcelable;
public class ParcableImplement implements Parcelable {
public int id;
public String name;
/**
* 当前对象的内容描述,一般返回0即可
*
* @return
*/
@Override
public int describeContents() {
return 0;
}
protected ParcableImplement(Parcel in) {
this.id = in.readInt();
this.name = in.readString();
}
/**
* 将当前对象写入序列化结构中
*
* @param dest
* @param flags
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id);
dest.writeString(this.name);
}
/**
* public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。
* 重写接口中的两个方法:
* createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,
* newArray(int size) 创建一个类型为T,长度为size的数组,供外部类反序列化本类数组使用。
*/
public static final Creator<ParcableImplement> CREATOR = new Creator<ParcableImplement>() {
/**
* 从序列化后的对象中创建原始对象
*/
@Override
public ParcableImplement createFromParcel(Parcel in) {
return new ParcableImplement(in);
}
/**
* 创建指定长度的原始对象数组
* @param size
* @return
*/
@Override
public ParcableImplement[] newArray(int size) {
return new ParcableImplement[size];
}
};
}
3 Parcelable 和 Serializable的区别
-
实现上的差异:
Serializable只需通过Serializable接口,给对象添加一个UID,系统会自动将其序列化;
Parcelable不只需要实现Parcelable接口,还需要在类中添加一个静态成员变量;要去实现读写的抽象方法,包括writeToParcel和createFromParcel等等。 -
效率上的对比:
在内存间传递数据,推荐使用Parcelable。安卓端的数据传递,包括Activity,AIDL等的数据传递。
序列化到存储设备,推荐使用Serializable。