主要包含三方面内容:Serializable接口、Parcelable接口以及Binder。
Serializable和Parcelable接口实现对象的序列化和反序列化过程。当我们需要Intent和Binder传输数据时就需要使用Parcelable或者Serializable。还有的时候我们需要使用Serializable来完成对象持久化到设备上或者通过网络传输给其他客户端。
- Serializable接口
serializableUID的详细工作机制:序列化的时候系统会把当前类的serizableUID写入到序列化的文件中(也可能是其他中介),当反序列化的时候系统会去检测问价中的serializableUID,用它来判断与当前类的serializableUID相等,相等说明序列化的类的版本和当前类的版本是相同的,这个时候可以成功反序列化;不相等说明当前类和序列化对象的类相比发生了某些变化,比如成员变量多了,这时是无法反序列化的,程序就会出现crash。
serialzableUID如果不手动指定,那么编译过程中工具会根据当前类的结构去自动生成它的hash值,如果类增加或删除了某些属性,那么hash值也会改变,导致类的serialzableUID值发生改变,导致反序列化过程程序crash。
serialzableUID不发生变化,纵使类的结构发生了非常规性改变,比如类名变了,成员变量类型变了,反序列化过程失败,但是不会导致程序crash。
把对象序列化到存储设备上,序列化及反序列化过程需要大量I/O操作,开销比较大,使用起来简单。
使用Serialzable接口时,手动的给类的属性serialzableUID设置一个值。
静态成员不属于类不参与序列化过程;其次用transient关键字修饰的属性也不参与序列化
- Parcelable接口
Parelable是Android中的序列化方式,因此更适合Android平台上,优点效率高,只要用在内存序列化上,但是使用起来稍微麻烦点。
Parcelable主要用在内存序列化上,它的效率很高,使用起来稍微麻烦。
public class People implements Parcelable {
public String name;
public int age;
public int height;
public String ID;
public String address;
public String tel;
public String gender;// 性别
public static final Parcelable.Creator<People> CREATOR = new Creator<People>() {
@Override
public People[] newArray(int size) {
// TODO Auto-generated method stub
return new People[size];
}
@Override
public People createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new People(source);
}
};
public People() {
}
public People(Parcel source) {
// TODO Auto-generated constructor stub
readFromParcel(source);
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated
// method stub
dest.writeString(name);
dest.writeInt(age);
dest.writeInt(height);
dest.writeString(ID);
dest.writeString(address);
dest.writeString(gender);
}
@Override
public void readFromParcel(Parcel parcel) {
name = parcel.readString();
age = parcel.readInt();
height = parcel.readInt();
ID = parcel.readString();
address = parcel.readString();
tel = parcel.readString();
gender = parcel.readString();
}
}
只要实现了这个接口,一个类的对象就可以序列化并可通过Intent和Bindler传递。
系统为我们提供了许多实现了Parcelable接口的类,他们都是可以直接序列化的,比如Intent、Bundle、Bitmap等,同时List和Map也可以序列化,前提是它们中的每个元素都是可序列化的。
通过Parceable将对象序列化到存储设备上或者将对象序列化后通过网络传输也都的可以的,但是这个过程稍显麻烦。也就是说Serializable能干的事儿,Parcelable都可以干。Parceable能干的,Serializable不一定能干。