2025-02-10

在android中使用Parcel(存儲基本數據類型和引用數據類型的容器)通過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.aiwalls.com
Parcel parcel = Parcel.obtain();//
獲取一個Parcel 對象下面就可以對其進行方法進行操作瞭,
createXXX(),wirteXXX(),readXXX(),
其中dataPosition(),返回當前Parcel當前對象存儲數據的偏移量,而setDataPosition(),設置當前Parcel對象的偏移量,方便讀取parcel中的數據,可問題就出在我讀取出來的數據要麼是空(null),要麼永遠是第一個偏移量處的值。Parcel采用什麼機制實現的,是以什麼形式的存儲的,然後我才能任意對其操作。
基本數據類型的取值范圍,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這樣的數據。。。由此我們可以推斷出,無論他存儲的是基本數據類型或引用數據類型的變量,都是以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 為基本的容器,依次存儲寫入的數據,基本和引用(其實引用的也是有多個基本數據類型組合而成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中基本數據類型的取值范圍,引用類型的數據,相當於c中的指針,以及各進制之間的相互轉換和靈活的引用,以及定制自己想要的任意進制數據類型。譯成串行化、序列化……,其作用是能將數據對象存入字節流當中,在需要時重新生成對象。主要應用是利用外部存儲設備保存對象狀態,以及通過網絡傳輸對象等。  

摘自 andy_android的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *