Parcel是如何存储数据

2023-10-27

Parcel是如何存储数据的

疑问:平时java使用它进行序列化要关注的点就是读写顺序,为什么要注意读写顺序呢?

在这里我将使用面对对象的思路用文字来大致描述这个过程。
例如我们当前序列化对象有两个变量,一个in类型,一个string类型。

第一步

大致查看源码发现初始化创建了当前Parcel对象,把对象转成long类型的对象传递给java层,有两个关键全局变量,一是在堆内存创建了一块内存,二是定义了一个int类型来记住偏移量。

第二步

初始化完了之后当我们开始写入int类型数据,将long类型数据传递给jni,native层将long类型转成之前创建的对象进行操作。
这个long实际就是我们创建的这个对象的指针地址强制转换来的,等下要操作对象又转回去。

创建了一块内存,那么就是内存地址连续了,定义的偏移量初始值是0.

指向内存的指针 + 挪动的偏移量大小 = 传递进来要存储对象的指针地址(指针的常规操作)
当第一次进来的时候,指针你可以认为是指向开始的地方,以数学的方式来理解:起点是0.
挪动的偏移量目前是0,也就是起点的位置记录了一个int类型的值。

存储之后修改偏移量,我从起点的位置开始记录,记录了一个int类型的数据,那么下一次记录应该从起点位置再挪动4个字节的地方再开始记录。

挪动多少
改变偏移量的值 += sizeof(int) Int类型多少字节的存储空间它就挪动多少

第三步

重复第二步的核心方法,指向内存的指针 + 挪动的偏移量大小 = 传递进来要存储对象的指针地址
改变偏移量的值 += sizeof(in)
后面写入什么数据都一个样重复调用这个过程

如何读取呢

首先看:指向内存的指针 + 挪动的偏移量大小 = 传递进来要存储对象的指针地址
指向内存的指针并没有改动过,也就是它还是指向开始的地方,这个时候我们只要把偏移量重置为0

那么读取就可以按照要读取的数据类型大小从开始的地方读取和挪动,跟写入的道理是一样的。

这就是Parcel的大致读写流程,当然还有其它一些边角代码,例如内存扩充这些。

Parcel和serializable

serializable是IO流的方式写入磁盘进行持久化。

Parcel我们已经大致了解,就是通过native的指针挪动方式将数据写入了堆内存,这种属于android的持久化方式肯定是比serializable好的,具体对比就不说了,知道了两者的持久化方式之后用脚指头想都能分辨出来应该使用那种。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Parcel是如何存储数据 的相关文章

随机推荐

  • ctf-web入门-文件上传

    Web 151 考点 后端无验证 前端校验 查看源码可以发现只能上传png图片 修改为php 写一个php文件上传一句话木马 可以发现已经成功上传 查看上级目录发现可疑文件 查看flag php文件内容得出flag 得到flag Web 1
  • 【python】leetcode中常用函数(持续更新)

    文章目录 1 1 Counter 计数器 1 2 enumerate 索引数组 1 3 defaultdict 缺省字典 1 4 deque 队列 1 5 heapq 堆 1 6 reduce 1 7 map 2 1 数组操作 2 3 字符
  • MATLAB深度学习之LSTM

    MATLAB深度学习之LSTM 深度学习工具箱 net trainNetwork sequences Y layers options clc clear 训练深度学习 LSTM 网络 进行序列到标签的分类 XTrain 是一个包含 270
  • Virtuoso工具基础讲解

    画图基础工具分为 Ic51 启动命令 icfb 渐淘汱 Ic61 启动命令 virtuoso 目前主流 建立电路 建立INV电路 操作指令 Tools library maneger 跳出新窗口 File New cell view 出现n
  • 右击 未出现 vscode打开

    右击 未出现 vscode打开 https blog csdn net Leo zjk article details 120883156 改动三处才有效 一是command要小写 然后Icon是 字符串值 三是最后不是 1 是 v don
  • (JS逆向专栏三)某玩游戏平台网站登入MD5加密

    声明 本文章中所有内容仅供学习交流 严禁用于商业用途和非法用途 否则由此产生的一切后果均与作者无关 若有侵权 请联系我立即删除 名称 365玩游戏平台 目标 登入参数 加密类型 MD5 目标网址 http minilogin sgty co
  • js小数计算丢失精度问题

    问题描述 js在计算小数计算如 1 0 2 的时候会丢失精度 即 1 0 2 0 19999999999999996 例如 console log 1 0 8 输出 0 19999999999999996 console log 6 0 7
  • QT的信号与槽函数

    一 什么是信号和槽函数 QT中通过信号 signal 和槽函数 slot 将事件和响应函数连接起来 可以类比MFC中的操作和对应的On开头的响应函数 它的优点在于信号和槽函数是松耦合的关系 你可以通过connect将两者连接起来 也可以通过
  • 【满分】【华为OD机试真题2023 JAVA&JS】任务总执行时长

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 任务总执行时长 知识点数组循环递归 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 任务编排服务负责对任务进行组合调度 参与编排的任务有两种类型 其中一种执行时长
  • 深入理解Java虚拟机jvm-对象的访问定位

    对象的访问定位 句柄 直接指针 优劣 句柄 直接指针 创建对象自然是为了后续使用该对象 我们的Java程序会通过栈上的reference数据来操作堆上的具 体对象 由于reference类型在 Java虚拟机规范 里面只规定了它是一个指向对
  • 云原生Kubernetes:K8S集群使用带凭证的harbor仓库

    目录 一 理论 1 部署harbor 创建私有项目 使用凭证登录 二 实验 1 部署harbor 创建私有项目 使用凭证登录 三 问题 1 harbor页面无法打开 2 生成harbor 登录凭据资源清单报错 3 tomcat deploy
  • 20220129刷题--第4题-- cookie

    20220129刷题 攻防世界 web新手第4题 cookie 直接burp抓包 看到 太明显了 查看cookie php呗 还得看包 看到response中 flag cyberpeace 10c8fa3cccaab62eaf04ff97
  • 刷脸支付服务商注定掀起一场商业革命

    随着5G时代的到来 互联网 AI智能 云计算 物联网等技术得到了高速发展 集这些技术于一身的刷脸支付注定掀起一场商业革命 对于创业者来说 刷脸支付代理是一个新的选择 在狂热的市场下 各大刷脸支付服务商层出不穷 为了招募代理奇招频出 何选择家
  • Stream流

    Stream流 文章目录 文章目录 Stream流 1 集合处理数据的弊端 2 Steam流式思想概述 3 Stream流的获取方式 3 1 根据Collection获取 3 2 通过Stream的of方法 4 Stream常用方法介绍 4
  • hashmap底层以及红黑树 终于懂了!!!

    目录 0 引言 1 红黑树 0 引言 jdk 1 7里面 HashMap中的数据结构是数组 单链表的组合 以键值对 key value 的形式存储元素的 通过put 和get 方法储存和获取对象 在JDK1 6 JDK1 7中 HashMa
  • openwrt--uci指令的使用

    UCI简介 UCI是集中式配置信息管理接口 Unified Configuration Interface 的缩写 他是OpenWrt引进的一套配置参数管理系统 UCI管理了OpenWrt下最主要的系统配置参数并且提供了简单 容易 标准化的
  • JAVA零基础学习课程个人笔记(全手打)

    目录 chapter01 Chapter02 目录 Chapter02 Day05 07 方法 Method 课堂笔记 chapter02 控制循环中断继续语句 chapter03 0 面向对象 chapter03 1 封装 chapter
  • 再见前端!纯Java撸个管理系统,这框架用起来贼爽!

    摘要 一个管理系统 往往需要后端 前端一起实现 单表CRUD操作往往都差不多 我们可以使用代码生成器来实现 有时候我们的管理系统只需要一些简单的CRUD页面 有没有什么框架能做到不写前端代码 纯Java撸个管理系统呢 这里推荐一个全栈类框架
  • golang通过代理访问url

    直接上实例 命令测试 curl proxy 10 0 55 22 8080 v http www baidu com package main import fmt io ioutil net http net url net time f
  • Parcel是如何存储数据

    Parcel学习 Parcel是如何存储数据的 第一步 第二步 第三步 如何读取呢 Parcel和serializable Parcel是如何存储数据的 疑问 平时java使用它进行序列化要关注的点就是读写顺序 为什么要注意读写顺序呢 在这