Android 序列化 Parcelable 跟 Serializable

来源:互联网 发布:轻论坛cms 编辑:程序博客网 时间:2024/05/29 12:32

      在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时,才不会报错。



0 0
原创粉丝点击