Android Parcelable和Serializable的区别

来源:互联网 发布:医疗器械软件风险管理 编辑:程序博客网 时间:2024/05/16 11:22

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];}};}




1 0
原创粉丝点击