在android中使用Parcel(儲存基礎資料型別 (Elementary Data Type)和引用資料類型的容器)通過IBinder來綁定,這種方法的作用是讓資料在進程間傳遞資料,Parcel定位就是輕量級的高效的對象序列化和還原序列化機制。
在Framework中有parcel類,源碼路徑是:
Frameworks/base/core/java/android/os/Parcel.java
典型的源碼片斷如下:
/
Write an integer value into the parcel at the current dataPosition(),
growing dataCapacity() if needed.
/
public final native void writeInt(int val);
/
Write a long integer value into the parcel at the current dataPosition(),
growing dataCapacity() if needed.
/
public final native void writeLong(long val);
他的方法如下: www.2cto.com
Parcel parcel = Parcel.obtain();//
擷取一個Parcel 對象下面就可以對其進行方法進行操作了,
createXXX(),wirteXXX(),readXXX(),
其中dataPosition(),返回當前Parcel當前Object Storage Service資料的位移量,而setDataPosition(),設定當前Parcel對象的位移量,方便讀取parcel中的資料,可問題就出在我讀取出來的資料要麼是空(null),要麼永遠是第一個位移量處的值。Parcel採用什麼機制實現的,是以什麼形式的儲存的,然後我才能任意對其操作。
基礎資料型別 (Elementary Data Type)的取值範圍,boolean 1bit、short 16bit、int 32bit、long 64bit、float 32bit、double 64bit、char 16bit、byte 8bit
由此我可以猜想,Parcel 32bit 作為基本單位儲存寫入的變數,4byte*8=32bit,在記憶體中的引用地址變數是採用16進位進行編碼,且作為位移量,即位移量是4的倍數,0,4,8,12,16,20,24,28,32,36,40,44,48……4*N,f(x) = 4*y{y>=0&y是自然數}
我想絕對不會出現向位移量是3,6,9這樣的資料。。。由此我們可以推斷出,無論他儲存的是基礎資料型別 (Elementary Data Type)或引用資料類型的變數,都是以32bit基本單位作為位移量。
parcel.writeInt(1);parcel.writeInt(2);parcel.writeInt(3);parcel.writeInt(4);parcel.writeInt(5);parcel.writeInt(6);parcel.writeInt(7);parcel.writeInt(81011111);parcel.writeFloat(1f);parcel.writeFloat(1000000000000000000000000000000000000f);parcel.writeXXX(),每寫一次資料,在32bit的空間裡能夠儲存要放入的變數,怎只佔一個位移量,也就之一動4個位置。
而當儲存的資料如:parcel.writeFloat(1000000000000000000000000000000000000f);他就自動往後移動,
parcel.writeString(“a”);parcel.writeString(“b”);parcel.writeString(“d”);parcel.writeString(“c”);和parcel.writeString(“abcd”); 的區別。
有此可見,他的記憶體的分配原來是這樣的。那我怎樣才能把我存進去的資料依次的去出來呢?setDataPosition(),設定parcel的位移量,在readXXX(),讀取資料
int size = parcel.dataSize();
int i = 0;
while (i <= size )
{
parcel.setDataPosition(i);
int curr_int = parcel.readInt();
i+=4;
int j = 0;
j++;
}
由此可見parcel寫入資料是按照32bit 為基本的容器,依次儲存寫入的資料,基本和引用(其實引用的也是有多個基礎資料型別 (Elementary Data Type)組合而成OBJECTS-屬性|方法),讀取的時候我們就可以按照這種規律根據目標資料的位移量的位置(curr_position),以及位移量的大小(size),取出已經存進去的資料了。
int i =curr_position;
while (i <= size )
{
parcel.setDataPosition(i);
int curr_int = parcel.readXXXt();
i+=4;
int j = 0;
j++;
}
最後提醒一句,在java中基礎資料型別 (Elementary Data Type)的取值範圍,參考型別的資料,相當於c中的指標,以及各進位之間的相互轉換和靈活的引用,以及定製自己想要的任意進位資料類型。譯成序列化、序列化……,其作用是能將資料對象存入位元組流當中,在需要時重建對象。主要應用是利用外部存放裝置儲存對象狀態,以及通過網路傳輸對象等。
摘自 andy_android的專欄