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