Android 使用Parcelable序列化對象
Android序列化對象主要有兩種方法,實現Serializable接口、或者實現Parcelable接口。實現Serializable接口是Java SE自己就支持的,而Parcelable是Android特有的功能,效率比實現Serializable接口高,並且還能夠用在IPC中。實現Serializable接口很是簡單,聲明一下就能夠了,而實現Parcelable接口稍微複雜一些,但效率更高,推薦用這種方法提升性能。下面就介紹一下實現Parcelable接口的方法
經過實現Parcelable接口序列化對象的步驟:
一、聲明實現接口Parcelable
二、實現Parcelable的方法writeToParcel,將你的對象序列化爲一個Parcel對象
三、實例化靜態內部對象CREATOR實現接口Parcelable.Creator:
- public static final Parcelable.Creator<T> CREATOR
其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須所有大寫。
四、完成CREATOR的代碼,實現方法createFromParcel,將Parcel對象反序列化爲你的對象
簡而言之:經過writeToParcel將你的對象映射成Parcel對象,再經過createFromParcel將Parcel對象映射成你的對象。也能夠將Parcel當作是一個流,經過writeToParcel把對象寫到流裏面,在經過createFromParcel從流裏讀取對象,只不過這個過程須要你來實現,所以寫的順序和讀的順序必須一致。
Parcel對象能夠經過如下方法寫入或讀取byte, double, float, int, long, String這6種類型變量。
- writeByte(byte), readByte()
- writeDouble(double), readDouble()
- writeFloat(float), readFloat()
- writeInt(int), readInt()
- writeLong(long), readLong()
- writeString(String), readString()
也能夠讀取或寫入他們的數組
- 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
示例代碼:
- package com.ipjmc.demo.parcelable;
-
-
- import java.util.Date;
-
- import android.os.Parcel;
- import android.os.Parcelable;
-
- public class ParcelableDate implements Parcelable { //聲明實現接口Parcelable
-
- //這裏定義了兩個變量來講明讀和寫的順序要一致
- public long mId;
- public Date mDate;
-
- public ParcelableDate(long id, long time) {
- mId = id;
- mDate = new Date(time);
- }
-
- public ParcelableDate(Parcel source) {
- //先讀取mId,再讀取mDate
- mId = source.readLong();
- mDate = new Date(source.readLong());
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- //實現Parcelable的方法writeToParcel,將ParcelableDate序列化爲一個Parcel對象
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- //先寫入mId,再寫入mDate
- dest.writeLong(mId);
- dest.writeLong(mDate.getTime());
- }
-
- //實例化靜態內部對象CREATOR實現接口Parcelable.Creator
- public static final Parcelable.Creator<ParcelableDate> CREATOR = new Creator<ParcelableDate>() {
-
- @Override
- public ParcelableDate[] newArray(int size) {
- return new ParcelableDate[size];
- }
-
- //將Parcel對象反序列化爲ParcelableDate
- @Override
- public ParcelableDate createFromParcel(Parcel source) {
- return new ParcelableDate(source);
- }
- };
- }
歡迎關注本站公眾號,獲取更多信息