1.作用
Serializable的作用是为了保存对象的属性到本地文件、网络流、数据库以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
从上面的设计上我们就可以看出优劣了。
2.效率
两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO流读写存储在硬盘上,
Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable。而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。
3.编程实现
3.1 Serializable 接口
通过Serializable方式来实现对象的序列化,实现起来非常简单,我们只要实现Serializable接口即可,并提供一个序列化版本id(serialVersionUID:序列化前后的id要一致)即可,因为几乎所有的工作都被系统自动完成了。
3.2 Parcelable接口
Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量(用来反序列化),实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。下面一个Parcelable的实现例子:
public class User implements Parcelable {
int userID;
String userNAME;
boolean isMale;
public User(int userID, String userNAME, boolean isMale) {
super();
this.userID = userID;
this.userNAME = userNAME;
this.isMale = isMale;
}
public User(Parcel in) {
userID = in.readInt();
userNAME = in.readString();
isMale = in.readInt() == 1;
}
public int describeContents() {
return 0;
}
// 序列化功能
public void writeToParcel(Parcel out, int flags) {
out.writeInt(userID);
out.writeString(userNAME);
out.writeInt(isMale ? 1 : 0);
}
// 反序列化功能:内部标明了如何创建序列化对象和数组
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
public User createFromParcel(Parcel in) {
return new User(in);
}
public User[] newArray(int size) {
return new User[size];
}
};
}