Android 使用Parcelable序列化对象

Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在IPC中。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。下面就介绍一下实现Parcelable接口的方法
通过实现Parcelable接口序列化对象的步骤:
1、声明实现接口Parcelable
2、实现Parcelable的方法writeToParcel,将你的对象序列化为一个Parcel对象
3、实例化静态内部对象CREATOR实现接口Parcelable.Creator:
Java代码 收藏代码
  1. publicstaticfinalParcelable.CreatorCREATOR
public static final Parcelable.Creator CREATOR
其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。
4、完成CREATOR的代码,实现方法createFromParcel,将Parcel对象反序列化为你的对象

简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。

Parcel对象可以通过以下方法写入或读取byte, double, float, int, long, String这6种类型变量。

Java代码 收藏代码
  1. writeByte(byte),readByte()
  2. writeDouble(double),readDouble()
  3. writeFloat(float),readFloat()
  4. writeInt(int),readInt()
  5. writeLong(long),readLong()
  6. writeString(String),readString()
writeByte(byte), readByte() writeDouble(double), readDouble() writeFloat(float), readFloat() writeInt(int), readInt() writeLong(long), readLong() writeString(String), readString()

也可以读取或写入他们的数组
Java代码 收藏代码
  1. writeBooleanArray(boolean[]),readBooleanArray(boolean[]),createBooleanArray()
  2. writeByteArray(byte[]),writeByteArray(byte[],int,int),readByteArray(byte[]),createByteArray()
  3. writeCharArray(char[]),readCharArray(char[]),createCharArray()
  4. writeDoubleArray(double[]),readDoubleArray(double[]),createDoubleArray()
  5. writeFloatArray(float[]),readFloatArray(float[]),createFloatArray()
  6. writeIntArray(int[]),readIntArray(int[]),createIntArray()
  7. writeLongArray(long[]),readLongArray(long[]),createLongArray()
  8. writeStringArray(String[]),readStringArray(String[]),createStringArray()
  9. writeSparseBooleanArray(SparseBooleanArray),readSparseBooleanArray()
writeBooleanArray(boolean[]), readBooleanArray(boolean[]), createBooleanArray() writeByteArray(byte[]), writeByteArray(byte[], int, int), readByteArray(byte[]), createByteArray() writeCharArray(char[]), readCharArray(char[]), createCharArray() writeDoubleArray(double[]), readDoubleArray(double[]), createDoubleArray() writeFloatArray(float[]), readFloatArray(float[]), createFloatArray() writeIntArray(int[]), readIntArray(int[]), createIntArray() writeLongArray(long[]), readLongArray(long[]), createLongArray() writeStringArray(String[]), readStringArray(String[]), createStringArray() writeSparseBooleanArray(SparseBooleanArray), readSparseBooleanArray()

更多操作可以参阅:
http://developer.android.com/reference/android/os/Parcel.html
示例代码:

Java代码 收藏代码
  1. packagecom.ipjmc.demo.parcelable;
  2. importjava.util.Date;
  3. importandroid.os.Parcel;
  4. importandroid.os.Parcelable;
  5. publicclassParcelableDateimplementsParcelable{//声明实现接口Parcelable
  6. //这里定义了两个变量来说明读和写的顺序要一致
  7. publiclongmId;
  8. publicDatemDate;
  9. publicParcelableDate(longid,longtime){
  10. mId=id;
  11. mDate=newDate(time);
  12. }
  13. publicParcelableDate(Parcelsource){
  14. //先读取mId,再读取mDate
  15. mId=source.readLong();
  16. mDate=newDate(source.readLong());
  17. }
  18. @Override
  19. publicintdescribeContents(){
  20. return0;
  21. }
  22. //实现Parcelable的方法writeToParcel,将ParcelableDate序列化为一个Parcel对象
  23. @Override
  24. publicvoidwriteToParcel(Parceldest,intflags){
  25. //先写入mId,再写入mDate
  26. dest.writeLong(mId);
  27. dest.writeLong(mDate.getTime());
  28. }
  29. //实例化静态内部对象CREATOR实现接口Parcelable.Creator
  30. publicstaticfinalParcelable.CreatorCREATOR=newCreator(){
  31. @Override
  32. publicParcelableDate[]newArray(intsize){
  33. returnnewParcelableDate[size];
  34. }
  35. //将Parcel对象反序列化为ParcelableDate
  36. @Override
  37. publicParcelableDatecreateFromParcel(Parcelsource){
  38. returnnewParcelableDate(source);
  39. }
  40. };
  41. }

你可能感兴趣的:(Android 使用Parcelable序列化对象)