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