序列化:Parcelable 和 Serializable
为了把对象的状态保存下来,存到磁盘中,会用到序列化
- 序列化:内存中的对象—>磁盘
- 反序列化:磁盘中的对象—>内存
1 Serializable
用serialVersionUID辅助,一个类对应一个serialVersionUID。反序列化时,先判断是否是当前类的对象,再决定是否可以反序列化。
实现简单,内存开销大。
java">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对象映射成我们的对象
java">import android.os.Parcel;
import android.os.Parcelable;public class ParcableImplement implements Parcelable {public int id;public String name;/*** 当前对象的内容描述,一般返回0即可** @return*/@Overridepublic int describeContents() {return 0;}protected ParcableImplement(Parcel in) {this.id = in.readInt();this.name = in.readString();}/*** 将当前对象写入序列化结构中** @param dest* @param flags*/@Overridepublic 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>() {/*** 从序列化后的对象中创建原始对象*/@Overridepublic ParcableImplement createFromParcel(Parcel in) {return new ParcableImplement(in);}/*** 创建指定长度的原始对象数组* @param size* @return*/@Overridepublic ParcableImplement[] newArray(int size) {return new ParcableImplement[size];}};
}
3 Parcelable 和 Serializable的区别
-
实现上的差异:
Serializable只需通过Serializable接口,给对象添加一个UID,系统会自动将其序列化;
Parcelable不只需要实现Parcelable接口,还需要在类中添加一个静态成员变量;要去实现读写的抽象方法,包括writeToParcel和createFromParcel等等。 -
效率上的对比:
在内存间传递数据,推荐使用Parcelable。安卓端的数据传递,包括Activity,AIDL等的数据传递。
序列化到存储设备,推荐使用Serializable。