您的位置:首页 > 其它

IPC基础概念介绍第二篇(Parcelable接口)

2016-09-05 21:12 483 查看
上一节我们介绍了通过Serializable方式来实现序列化的方法,本节接着介绍另一种序列化方式:Parcelable。Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。

public class User implements Parcelable {

private int userId;
private String userName;
private boolean isMale;

public User(int userId, String userName, boolean isMale) {
this.userId = userId;
this.userName = userName;
this.isMale = isMale;
}

public User(Parcel source) {
userId = source.readInt();
userName = source.readString();
isMale = source.readInt() == 1;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(userId);
dest.writeString(userName);
dest.writeInt(isMale ? 0 : 1);
}

public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {

@Override
public User createFromParcel(Parcel source) {
return new User(source);
}

@Override
public User[] newArray(int size) {
return new User[size];
}
};
}


这了说一下Parcle,Parcle内部包装了可序列化的数据,可以在Binder中自由传输。从上述代码中可以看出,在序列化过程中需要实现的功能有序列化,反序列化和内容描述。序列化功能由writeToParcle方法来完成,最终通过Parcle中的一系列write方法来实现的;反序列化有CAEATOR来完成,其内部标明了如何创建序列化对象和数组,并通过Parcle的一系列read方法来完成反序列化过程。

系统已经为我们提供了许多实现Parcelable接口的类,它们都是可以直接序列化的,比如Intent,Bundle,Bitmap等,同时List和Map也可以序列化,前提是它们里面的每一个元素都是可序列化的。

既然Parcelable和Serializable都能实现序列化并且都可用于Intent间的数据传递,那么二者该如何选择呢?Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要很大量的I/O操作。而Parcelable是Android中的序列化方式,因此更适合用在Android平台上,它的确定是使用起来稍微麻烦点,但是它的效率很高,这是Android推荐的序列化方式,因此我们要首选Parcelable。Parcelable主要用在内存序列化上,通过Parcelable将对象序列化到存储设备中或则将对象序列化后通过网络传输也都是可以的,但是这个过程会稍微复杂,因此在这两种情况下建议大家使用Serializable。以上就是Parcelable和Serializable的区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: