Android 序列化 Parcelable 跟 Serializable

      在Android开发的过程中,有些时候,我们需要在Activity之间传递对象。那么此时,就需要将该对象序列化。

      序列化方式有两种,一种是Serializable,用起来也比较简单。只要将所用对象实现Serializable便可。 另外一种是Parcelable,这种是android自身所带有的序列化。

      实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高。

      下面写一个实体类实现Parcelable,其中的类成员变量覆盖了String, int, List, boolean几个常见的数据类型以及对象类型,具体步骤有4个

       1、声明实现接口Parcelable

       2、实现Parcelable的方法writeToParcel,将你的对象序列化为一个Parcel对象      

       3、实例化静态内部对象CREATOR实现接口Parcelable.Creator 。Java代码如下

               public static final Parcelable.Creator<T> CREATOR 

         其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。  

       4、完成CREATOR的代码,实现方法createFromParcel,将Parcel对象反序列化为你的对象 。

       

package com.botision.chat.boti.bean;

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by Botision.Huang on 2015/7/24.
 */
public class AlipayOrders implements Parcelable {

    private String alipayNo;
    private int orderAcount;
    private List<Order> orders;
    private boolean isPay;
    private Order orderItem;
    private List<String> urlStrings = new ArrayList<String>();

    public static final Creator<AlipayOrders> CREATOR = new Creator<AlipayOrders>() {

        @Override
        public AlipayOrders createFromParcel(Parcel parcel) {
            return new AlipayOrders(parcel);
        }

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

    public AlipayOrders(Parcel parcel){
        this.alipayNo = parcel.readString();
        this.orderAcount = parcel.readInt();
        Parcelable[] pars = parcel.readParcelableArray(Order.class.getClassLoader());
        this.orders = Arrays.asList(Arrays.asList(pars).toArray(new Order[pars.length]));
        this.isPay = parcel.readByte() != 0;
        this.orderItem = parcel.readParcelable(Order.class.getClassLoader());
        parcel.readStringList(this.urlStrings);
    }

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

    @Override
    public void writeToParcel(Parcel dest, int i) {
        dest.writeInt(this.orderAcount);
        dest.writeParcelableArray(this.orders.toArray(new Order[this.orders.size()]), i);
        dest.writeByte((byte) (this.isPay ? 1 : 0));
        dest.writeParcelable(this.orderItem, i);
        dest.writeStringList(this.urlStrings);
    }

    public String getAlipayNo() {
        return alipayNo;
    }

    public void setAlipayNo(String alipayNo) {
        this.alipayNo = alipayNo;
    }

    public int getOrderAcount() {
        return orderAcount;
    }

    public void setOrderAcount(int orderAcount) {
        this.orderAcount = orderAcount;
    }

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }

    public boolean isPay() {
        return isPay;
    }

    public void setIsPay(boolean isPay) {
        this.isPay = isPay;
    }

    public Order getOrderItem() {
        return orderItem;
    }

    public void setOrderItem(Order orderItem) {
        this.orderItem = orderItem;
    }

    public List<String> getUrlStrings() {
        return urlStrings;
    }

    public void setUrlStrings(List<String> urlStrings) {
        this.urlStrings = urlStrings;
    }
}

      最后再说明下,如果该实体类是用于GSON解析的话,那么CREATOR中的每一项的顺序(上面代码被我new了一个方法出来)必须与writeToparcel中的每一项相同。这样,在解析JSON时,才不会报错。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值