Serializable和Parcelable的区别

首先Serializable和Parcelable都是用来完成对象的序列化和反序列化的,在安卓里在Activity之间互传对象需要将该对象实现Serializable或者Parcelable两个接口,或者在做持久化存储的时候也可以通过实现上面两个接口来进行序列化存储到本地,但是笔者做的较多的是使用fastjson转成String,实验得到fastjson的效率较Serializable要高。

1.Serializable

Serializable是Java提供的一个序列化接口。

public interface Serializable {
}

这个是Serializable的源码,我们可以看到它是一个空接口,我们只需要实现该接口并在类中声明一个标识:
private static final long serialVersionUID=987492387498237L;
这里我们详细说一下SerialVersionUID,在序列化的时候会将serialVersionUID写入序列化文件中,然后在反序列化的时候会对反序列化后的serialVersionUID进行校验,一致才算序列化成功,否则会抛异常。我们在写代码的时候可以不用手动指定该值,系统会计算该类的hash值并赋值给serialVersionUID,但是如果在反序列中有成员变量的增加或删除,该hash值会改变,导致反序列化不成功,所以我们正常情况下最好是自己指定serialVersionUID。

2.Parcelable

Parcelable是安卓中的序列化方式,主要使用在内存序列化中,它的效率要优于Serializable。下面提供一个典例用法:

/**
 * <*****>
 *
 * @author liuzaibing
 * @version [版本号, 2017/1/3]
 * @see [相关类/方法]
 * @since [V1]
 */
public class Base implements Parcelable {
    private int id;

    private String name;

    protected Base(Parcel in) {
        id = in.readInt();
        name = in.readString();
    }

    public static final Creator<Base> CREATOR = new Creator<Base>() {
        @Override
        public Base createFromParcel(Parcel in) {
            return new Base(in);
        }

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(name);
    }
}

上面代码看着挺长的,这也是为什么Parcelable被大家用的少的原因吧。但是现在笔者AS已经支持自动生成这些方法和代码,虽然会自动生成但是还是要看看里面各个方法的意思和参数,下面会对各个方法和参数进行讲解。
* writeToParcel是用来进行序列化的,内部调用了write方法,flags 1:当前对象作为返回值返回,不要释放资源 但是绝大多数情况都是0
* describeContents 返回对象的内容描述,有文件描述符 1 否则 0 大多数都是0
* Base(Parcel in) 从序列化后的对象创建原始对象
* Creator实现反序列化 具体内部方法不进行分析

最后总结下,在安卓平台中大多数情况都要使用Parcelable,效率很高,但是如果是本地存储或者网络传输推荐使用Serializable。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值