探索Android中的Parcel机制(上)

探索Android中的Parcel机制(上)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

一.先从Serialize说起

         我们都知道JAVA中的Serialize机制,译成串行化、序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。

 

二.Android中的新的序列化机制

         Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中採用了新的IPC(进程间通信)机制,必定要求使用性能更出色的对象传输方式。在这种环境下,Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。

 

三.Parcel类的背后

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

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

典型的源代码片断例如以下:

 

 

  

 

         从中我们看到,从这个源程序文件里我们看不到真正的功能是怎样实现的,必须透过JNI往下走了。于是,Frameworks/base/core/jni/android_util_Binder.cpp中找到了线索

 

  

         从这里我们能够得到的信息是函数的实现依赖于Parcel指针,因此还须要找到Parcel的类定义,注意,这里的类已经是用C++语言实现的了。

         找到Frameworks/base/include/binder/parcel.hFrameworks/base/libs/binder/parcel.cpp。最终找到了最终的实现代码了。

         有兴趣的朋友能够自己读一下,不难理解,这里把主要的思路总结一下:

1.       整个读写全是在内存中进行,主要是通过malloc()realloc()memcpy()等内存操作进行,所以效率比JAVA序列化中使用外部存储器会高非常多;

2.       读写时是4字节对齐的,能够看到#define PAD_SIZE(s) (((s)+3)&~3)这句宏定义就是在做这件事情;

3.       假设预分配的空间不够时newSize = ((mDataSize+len)*3)/2;会一次多分配50%

4.       对于普通数据,使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址。后者是通过flatten_binder()unflatten_binder()实现的,目的是反序列化时读出的对象就是原对象而不用又一次new一个新对象。

 

好了,这就是Parcel背后的动作,全是在一块内存里进行读写操作,就不啰嗦了,把parcel的代码贴在这供没有源代码的朋友參考吧。接下来我会用一个小DEMO演示一下Parcel类在应用程序中的使用,详见《探索Android中的Parcel机制(下)》。

 

 

 

         本文的源代码使用的是Android 2.1版本号。

 

——欢迎转载,请注明出处 http://blog.csdn.net/caowenbin ——

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118144.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python 如何使用swagger

    swagger介绍swagger是一个api文档工具,集api管理,测试,访问于一体的网页版api文档工具了解更多,请访问相关网站swagger官网swaggergithubOpenApi参数说明python相关包connexionflasggerflask-swag,flask-swaggerFlask-RESTPluspythonswagger-cod…

    2022年4月12日
    699
  • matlab中三角函数的反函数怎么表示(反三角函数的对应数值)

    原文地址:Matlab反三角函数表示作者:蓝薇-Matlab反三角函数命令:asin(),acos(),atan(),acot()生成的值为弧度值,即rad;asind(),acosd(),atand(),acotd()生成的值为角度值;将弧转换为角度的命令:rad2deg()deg2rad()作用则相反…

    2022年4月10日
    370
  • bs与cs架构的区别_cs架构嵌入BS

    bs与cs架构的区别_cs架构嵌入BSC/S架构:即Client/Server架构,即客户端/服务器架构。是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客户端才可进行管理操作。客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等,客户端程序主要完成用户的具体的业务。开发比较容易,操作简便,但应用程序的升级和客…

    2022年10月10日
    3
  • strstr c语言函数实现,strstr函数实现(C语言)

    strstr c语言函数实现,strstr函数实现(C语言)strstr函数实现(C语言)second6020180601数组strstr用来字符串查找子串。数据结构顺便说一下,字符串操做函数是C语言中很是重要的函数,里面包括了指针的精华,同时对学习数据结构,如链表,数组,有很是好的练手方法。同时,知道内部实现,是基础中的基础。因此学习字符串操做函数是深刻学C的必经之路。函数#include#includeconstchar*strs…

    2022年6月25日
    32
  • python读取txt文件的行数

    python读取txt文件的行数python读取txt文件的行数python读取txt文件的行数python读取txt文件的行数count=len(open(filepath,’rU’).readlines())

    2022年5月23日
    57
  • office文件 vue 预览_vue实现pdf文档在线预览功能

    office文件 vue 预览_vue实现pdf文档在线预览功能针对android系统不支持pdf文档在线预览,可通过引入pdf.js插件实现,其具体实现步骤如下一、引入插件方式一:npminstall–savepdfjs-dist,安装完成后在vue项目的node_modules出现如下依赖方式二:只引入pdf.js的核心文件pdf.js和pdf.work.js,其他无关的文件全部删除,如图方式三:将插件直接放在static文件夹下,如图二、前端页面…

    2022年5月18日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号