Android序列化對象主要有兩種方法,,實現(xiàn)Serializable接口,、或者實現(xiàn)Parcelable接口。實現(xiàn)Serializable接口是Java SE本身就支持的,,而Parcelable是Android特有的功能,,效率比實現(xiàn)Serializable接口高,而且還可以用在IPC中,。實現(xiàn)Serializable接口非常簡單,,聲明一下就可以了,而實現(xiàn)Parcelable接口稍微復雜一些,,但效率更高,,推薦用這種方法提高性能。下面就介紹一下實現(xiàn)Parcelable接口的方法
通過實現(xiàn)Parcelable接口序列化對象的步驟:
1,、聲明實現(xiàn)接口Parcelable
2,、實現(xiàn)Parcelable的方法writeToParcel,將你的對象序列化為一個Parcel對象
3,、實例化靜態(tài)內(nèi)部對象CREATOR實現(xiàn)接口Parcelable.Creator:- public static final Parcelable.Creator<T> CREATOR
其中public static final一個都不能少,,內(nèi)部對象CREATOR的名稱也不能改變,必須全部大寫,。
4,、完成CREATOR的代碼,,實現(xiàn)方法createFromParcel,將Parcel對象反序列化為你的對象
簡而言之:通過writeToParcel將你的對象映射成Parcel對象,,再通過createFromParcel將Parcel對象映射成你的對象,。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流里面,,在通過createFromParcel從流里讀取對象,,只不過這個過程需要你來實現(xiàn),因此寫的順序和讀的順序必須一致,。
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()
也可以讀取或?qū)懭胨麄兊臄?shù)組
- 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./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 { //聲明實現(xiàn)接口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;
- }
-
- //實現(xiàn)Parcelable的方法writeToParcel,,將ParcelableDate序列化為一個Parcel對象
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- //先寫入mId,,再寫入mDate
- dest.writeLong(mId);
- dest.writeLong(mDate.getTime());
- }
-
- //實例化靜態(tài)內(nèi)部對象CREATOR實現(xiàn)接口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);
- }
- };
- }
|