Parcelable接口相对Serializable接口比较复杂,但是有一套模板代码可以参考,所有的实现Parcelable接口的类都跟模板代码类似。
1 package com.example.murphy.helloworld; 2 3 import android.app.Person; 4 import android.os.Parcel; 5 import android.os.Parcelable; 6 7 public class UserP implements Parcelable { 8 private String account; 9 private String password;10 11 //创建私有构造器,供CREATOR使用,从Parce回复数据12 private UserP(Parcel in) {13 account = in.readString();14 password = in.readString();15 }16 17 //用来恢复自定义对象18 public static final CreatorCREATOR=new Creator () {19 @Override20 public UserP createFromParcel(Parcel source) {21 return new UserP(source);22 }23 24 @Override25 public UserP[] newArray(int size) {26 return new UserP[size];27 }28 };29 30 31 @Override32 public int describeContents() {33 return 0;34 }35 36 /*将数据写到Parce中*/37 @Override38 public void writeToParcel(Parcel dest, int flags) {39 dest.writeString(password);40 dest.writeString(account);41 }42 }
序列化之后可使用Bundle的putParcelable的方法,将实现Parcelable接口的对象放进bundle打包进Intent然后传送。
序列化功能由writeToParcel来完成,最终是通过Parcel中的一系列write方法来完成的;反序列化功能由CREATOR来完成,其内部表明了如何创建序列化对象和数据,并通过Parcel的一系列read方法来完成反序列化的过程;内容描述功能由describeContents方法来完成,几乎在所有情况下这个方法都是返回0,仅当当前对象中存在文件描述符时,此方法返回1.需要注意的是,由于person是另一个可序列化对象,所以它的反序列化过程需要传递当前线程的上下文类加载器,否则会报无法找到类的错误。
Serializable和Parcelable选择哪个?
Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I\O操作。而Parcelable是Android中序列化方式,因此更适合用在Android平台上,它的缺点是使用起来稍微复杂一点,但是因为有一套模板,所以这点复杂还是可以接受的,而且它的效率很高,这也是Android推荐的序列化方式,因此在Android平台上首选Parcelable。