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

上一节我们介绍了通过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的区别。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值