【Java、Android】序列化:Parcelable 和 Serializable

序列化:Parcelable 和 Serializable

为了把对象的状态保存下来,存到磁盘中,会用到序列化

  1. 序列化:内存中的对象—>磁盘
  2. 反序列化:磁盘中的对象—>内存

1 Serializable

用serialVersionUID辅助,一个类对应一个serialVersionUID。反序列化时,先判断是否是当前类的对象,再决定是否可以反序列化。

实现简单,内存开销大。

import java.io.Serializable;
public class SerializableImplement implements Serializable {
    /**
     * 生成序列号标识
     */
    private static final long serialVersionUID = -2083503801443301445L;

    private int id;
    private String name;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2 Parcelable

为了解决Serializable内存开销大的问题,安卓提供了Parcelable。

Parcelable代码实现麻烦,但是内存开销小。

  1. 用writeToParcel方法,将对象映射成Parcel对象;
  2. 通过createFromParcel方法,将Parcel对象映射成我们的对象
import android.os.Parcel;
import android.os.Parcelable;

public class ParcableImplement implements Parcelable {

    public int id;
    public String name;
    
    /**
     * 当前对象的内容描述,一般返回0即可
     *
     * @return
     */
    @Override
    public int describeContents() {
        return 0;
    }

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

    /**
     * 将当前对象写入序列化结构中
     *
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeString(this.name);
    }

    /**
     * public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。
     * 重写接口中的两个方法:
     * createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,
     * newArray(int size) 创建一个类型为T,长度为size的数组,供外部类反序列化本类数组使用。
     */
    public static final Creator<ParcableImplement> CREATOR = new Creator<ParcableImplement>() {
        /**
         * 从序列化后的对象中创建原始对象
         */
        @Override
        public ParcableImplement createFromParcel(Parcel in) {
            return new ParcableImplement(in);
        }

        /**
         * 创建指定长度的原始对象数组
         * @param size
         * @return
         */
        @Override
        public ParcableImplement[] newArray(int size) {
            return new ParcableImplement[size];
        }
    };
}

3 Parcelable 和 Serializable的区别

  1. 实现上的差异:
    Serializable只需通过Serializable接口,给对象添加一个UID,系统会自动将其序列化;
    Parcelable不只需要实现Parcelable接口,还需要在类中添加一个静态成员变量;要去实现读写的抽象方法,包括writeToParcel和createFromParcel等等。

  2. 效率上的对比:
    在内存间传递数据,推荐使用Parcelable。安卓端的数据传递,包括Activity,AIDL等的数据传递。
    序列化到存储设备,推荐使用Serializable。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值