Android 开发中Parcel存储类型和数据容器
2016-05-18 17:41
281 查看
在android中使用Parcel(存储基本数据类型和引用数据类型的容器)通过IBinder来绑定,这种方法的作用是让数据在进程间传递数据,Parcel定位就是轻量级的高效的对象序列化和反序列化机制。
在Framework中有parcel类,源码路径是:
Frameworks/base/core/java/android/os/Parcel.java
典型的源码片断如下:
他的方法如下:
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(),读取数据
由此可见parcel写入数据是按照32bit 为基本的容器,依次存储写入的数据,基本和引用(其实引用的也是有多个基本数据类型组合而成OBJECTS-属性|方法),读取的时候我们就可以按照这种规律根据目标数据的偏移量的位置(curr_position),以及偏移量的大小(size),取出已经存进去的数据了。
最后提醒一句 , 在 java中基本数据类型的取值范围,引用类型的数据,相当于c中的指针,以及各进制之间的相互转换和灵活的引用,以及定制自己想要的任意进制数据类型。 译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。
在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);
他的方法如下:
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中的指针,以及各进制之间的相互转换和灵活的引用,以及定制自己想要的任意进制数据类型。 译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。
相关文章推荐
- 一些关于数据存储和查询优化的想法
- 正确面对服务器数据存储防止数据丢失
- 高性能Javascript笔记 数据的存储与访问性能优化
- 在android开发中进行数据存储与访问的多种方式介绍
- Android数据存储之SQLite使用
- Android 数据存储方式有哪几种
- 四种Android数据存储方式
- Python使用shelve模块实现简单数据存储的方法
- android中使用SharedPreferences进行数据存储的操作方法
- Android基础——数据存储
- 使用偏好设置存储数据
- Android实现数据存储5种技术
- Android数据的四种存储方式
- LUN 是个什么东西
- 编程狂人第三十一期
- 编程狂人第三十三期,程序员必读的技术周刊
- Android数据储存——SharedPreferences储存
- android中数据存储的ContentProvider的使用方法
- PHP学习笔记2:文件
- iOS应用数据存储的常用方式(一)