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 Creator<UserP> CREATOR=new Creator<UserP>() { 19 @Override 20 public UserP createFromParcel(Parcel source) { 21 return new UserP(source); 22 } 23 24 @Override 25 public UserP[] newArray(int size) { 26 return new UserP[size]; 27 } 28 }; 29 30 31 @Override 32 public int describeContents() { 33 return 0; 34 } 35 36 /*将数据写到Parce中*/ 37 @Override 38 public void writeToParcel(Parcel dest, int flags) { 39 dest.writeString(password); 40 dest.writeString(account); 41 } 42 }
序列化功能由writeToParcel来完成,最终是通过Parcel中的一系列write方法来完成的;反序列化功能由CREATOR来完成,其内部表明了如何创建序列化对象和数据,并通过Parcel的一系列read方法来完成反序列化的过程;内容描述功能由describeContents方法来完成,几乎在所有情况下这个方法都是返回0,仅当当前对象中存在文件描述符时,此方法返回1.需要注意的是,由于person是另一个可序列化对象,所以它的反序列化过程需要传递当前线程的上下文类加载器,否则会报无法找到类的错误。 Serializable和Parcelable选择哪个?
Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I\O操作。而Parcelable是Android中序列化方式,因此更适合用在Android平台上,它的缺点是使用起来稍微复杂一点,但是因为有一套模板,所以这点复杂还是可以接受的,而且它的效率很高,这也是Android推荐的序列化方式,因此在Android平台上首选Parcelable。