在android中使用Parcel(存储基本数据类型和引用数据类型的容器)通过IBinder来绑定,这种方法的作用是让数据在进程间传递数据,Parcel定位就是轻量级的高效的对象序列化和反序列化机制。

在Framework中有parcel类,源码路径是:

Frameworks/base/core/java/android/os/Parcel.java

典型的源码片断如下:

/

WriteanintegervalueintotheparcelatthecurrentdataPosition(),

growingdataCapacity()ifneeded.

/

publicfinalnativevoidwriteInt(intval);

/

WritealongintegervalueintotheparcelatthecurrentdataPosition(),

growingdataCapacity()ifneeded.

/

publicfinalnativevoidwriteLong(longval);

他的方法如下:

Parcelparcel=Parcel.obtain();//

获取一个Parcel对象下面就可以对其进行方法进行操作了,

createXXX(),wirteXXX(),readXXX(),

其中dataPosition(),返回当前Parcel当前对象存储数据的偏移量,而setDataPosition(),设置当前Parcel对象的偏移量,方便读取parcel中的数据,可问题就出在我读取出来的数据要么是空(null,要么永远是第一个偏移量处的值。Parcel采用什么机制实现的,是以什么形式的存储的,然后我才能任意对其操作。

基本数据类型的取值范围,boolean1bitshort16bitint32bitlong64bitfloat32bitdouble64bitchar16bitbyte8bit

由此我可以猜想,Parcel32bit作为基本单位存储写入的变量,4byte*8=32bit,在内存中的引用地址变量是采用16进制进行编码,且作为偏移量,即偏移量是4的倍数,0,4,8,12,16,20,24,28,32,36,40,44,48……4*N,f(x)=4*yy>=0&y是自然数}

我想绝对不会出现向偏移量是369这样的数据。。。由此我们可以推断出,无论他存储的是基本数据类型或引用数据类型的变量,都是以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(),读取数据

intsize=parcel.dataSize();

inti=0;

while(i<=size)

{

parcel.setDataPosition(i);

intcurr_int=parcel.readInt();

i+=4;

intj=0;

j++;

}

由此可见parcel写入数据是按照32bit为基本的容器,依次存储写入的数据,基本和引用(其实引用的也是有多个基本数据类型组合而成OBJECTS-属性|方法),读取的时候我们就可以按照这种规律根据目标数据的偏移量的位置(curr_position),以及偏移量的大小(size),取出已经存进去的数据了。

inticurr_position

while(i<=size)

{

parcel.setDataPosition(i);

intcurr_int=parcel.readXXXt();

i+=4;

intj=0;

j++;

}

最后提醒一句 java中基本数据类型的取值范围,引用类型的数据,相当于c中的指针,以及各进制之间的相互转换和灵活的引用,以及定制自己想要的任意进制数据类型。 译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 类和 Json对象
  4. 《Android开发从零开始》——25.数据存储(4)
  5. Android系统配置数据库注释(settings.db)
  6. Android中不同应用间实现SharedPreferences数据共享
  7. android图表ichartjs
  8. Android内容提供者源码
  9. Android中文API(144) —— JsonWriter

随机推荐

  1. Android中Context的传递
  2. Android(安卓)Activity生命周期举例说明(
  3. Kotlin集合—MutableList可变列表、Set、
  4. 【Android(安卓)进阶】Iconfont 图标的使
  5. Flutter ubuntu 环境搭建
  6. 2014.04.22 ——— android listview hea
  7. Android(安卓)Studio连接不上模拟器的解
  8. android 权限介绍(二)
  9. 蓝牙hid协议源码解析
  10. [原]android 链接错误