Android 序列化Parcelable的使用详解

2023-05-16

背景:

在Java虚拟机中,对象的传递称为数据传递不可或缺的一部分,但如果一旦虚拟机停止工作,该对象在内存中也就被释放,地址空间不存在,对象自然就不能再被重复利用,如果我们想持久使用这个对象怎么办?写到文件中?存数据库?最好的方法就是能够保存下来,把一个对象的空间地址以及属性保存下来,在Java中已提供了一个接口Serializable。

1.Serializable是Java的JDK提供的,由于该序列化不够丝滑,在PC等大型操作系统中使用,体验不出来,如果在Adnroid 虚拟机中,数据的传递存在一定的差异,这时,google官方提供了新的序列化对象Parcelable

Parcelable相比较Serializable要复杂的很多,Serializable序列化只要对象继承该接口,即可。但是Parcelable需要我们手动去分装

Parcelable序列化的封装

说明:

如果最外层Bean需要实现Parcelable,那么内部的变量也是一个类对象,也要实现序列化,可以先从变量类开始序列化,最后实现外层bean的序列化

序列化之前先把变量定义好,这样用助于后面序列化的操作

1.IDE自动封装

1.1先将当前类继承接口Parcelable

1.2将鼠标悬停在错误提示位置,这个时候IDE提示如下

1.3 我们只需要点击Add  implementation Parcelable

1.4IDE会自动完成组装,自动读写变量

结果如下:


public class MyParcelBean implements Parcelable {


    private int age;
    private String name;
    private boolean sex;


    protected MyParcelBean(Parcel in) {
        age = in.readInt();
        name = in.readString();
        sex = in.readByte() != 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
        dest.writeByte((byte) (sex ? 1 : 0));
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<MyParcelBean> CREATOR = new Creator<MyParcelBean>() {
        @Override
        public MyParcelBean createFromParcel(Parcel in) {
            return new MyParcelBean(in);
        }

        @Override
        public MyParcelBean[] newArray(int size) {
            return new MyParcelBean[size];
        }
    };
}  

**************************************************************************************************

2.手动封装

手动封装我们需要知道,处理哪些东西,这些东西是什么。流程是什么

同样已MyParcelBean类为例,

2.1.类的变量定义好了,然后继承接口Parcelable

2.2.重写以下方法


@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name); 
        dest.writeByte((byte) (sex ? 1 : 0));

}  

writeToParcel是我们需要处理的地方,这边提供了两个参数:Parcel 和flags

Parcel :是变量的封装,

flags:是标识

接下来我们重点讲解Parcel

1.Parcel 主要提供数据的读写,如果你是什么类型,在读写过程就用什么类型,但是boolean除外,

2.boolean类型再Parcel中,没有该类型,通过通过byte类型替代

3.读写的顺序必须对应,如下:


dest.writeInt(age);
dest.writeString(name);
dest.writeByte((byte) (sex ? 1 : 0));  

存的顺序是这样,那么读的顺序也一定要这样,否则数据会异常


protected MyParaceBean(Parcel in) {
    age = in.readInt();
    name = in.readString();
    sex = in.readByte() != 0;
}
  

3.每个parcelable接口都有一个造物者,我们还要实现这个固定写法:


public static final Creator<MyParaceBean> CREATOR = new Creator<MyParaceBean>() {
    @Override
    public MyParaceBean createFromParcel(Parcel in) {
        return new MyParaceBean(in);
    }

    @Override
    public MyParaceBean[] newArray(int size) {
        return new MyParaceBean[size];
    }
};  

这是固定写法

4.我们需要实现一个保护类型的构造器,用来读在这数据


protected MyParaceBean(Parcel in) {
    age = in.readInt();
    name = in.readString();
    sex = in.readByte() != 0;
}  

5.关于Parcel write写有些要注意的地方

5.1对象的保存

如果保存一个对象,这个对象必须也要实现parcelable接口

在Bean中


private MyParaceBeanChild child;  

写:


dest.writeParcelable(child, flags);  

读:


child = in.readParcelable(MyParaceBeanChild.class.getClassLoader());  

5.2数组数据的保存

List的数据保存,也是需要在List泛型对象中先实现parcelable的接口,

在Bena中定义如下:


private List<MyParaceBeanChild> list;  

写:


dest.writeTypedList(list);  

读:


list = in.createTypedArrayList(MyParaceBeanChild.CREATOR);  

5.3Boolean类型

类型不支持,通过byte来复写,可以参考上面boolean说法

一般在读写类型中,Parcel数据封装提供了对应的绝大多数类型。

总结:

核心点:

1.构造器读数据


protected MyParaceBean(Parcel in) {
 
}  

2.重写方法:写数据


@Override  

public void writeToParcel(Parcel dest, int flags) {
  
}  

3.造物标识:CREATOR


public static final Creator<MyParaceBean> CREATOR = new Creator<MyParaceBean>() {
    @Override
    public MyParaceBean createFromParcel(Parcel in) {
        return new MyParaceBean(in);
    }

    @Override
    public MyParaceBean[] newArray(int size) {
        return new MyParaceBean[size];
    }
};  

只需要处理好这三个地方,其他都是自己的Java逻辑。

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

Android 序列化Parcelable的使用详解 的相关文章

  • Lua实现矩阵的加减乘除

    Lua实现矩阵的加减乘除 参考文章 xff1a https blog csdn net qq 54180412 article details 122943327 https www bilibili com video BV1434y18
  • ubuntu系统配置大恒相机驱动并读取ros话题

    文章目录 0 说明1 安装大恒相机sdk1 1 下载1 2 安装sdk 用于配置ip和调试相机参数 1 电脑网卡配置 网卡固定ip 2 查看相机图像以及配置相机参数 2 安装ros驱动包 注 xff1a 大恒相机官方没ros驱动 2 0 正
  • C++类对象与Lua之间的交互

    C 43 43 类对象与Lua之间的交互 C语言与Lua进行交互 xff0c 我们可以相对轻易的做到 xff0c 但在实际应用中我们更加偏向于使用C 43 43 与Lua进行交互 xff0c 面向对象编程 关于C语言与Lua之间的调用交互实
  • C++与Lua交互实例 -- 矩阵的加减乘除(版本一)

    C 43 43 与Lua交互实例 矩阵的加减乘除 xff08 版本一 xff09 关于lua中封装的类模板以及相关知识可参考以下链接 xff1a https ufgnix0802 blog csdn net article details
  • C++与Lua交互实例 -- 矩阵的加减乘除(版本二)

    C 43 43 与Lua交互实例 矩阵的加减乘除 xff08 版本二 xff09 TIPS xff1a 关于使用矩阵的加减乘除测试C 43 43 与Lua的交互以及下面没讲述到的知识点可以阅读第一版 xff1a https blog csd
  • Windows下LuaBridge2.8的环境配置及简单应用

    Windows下LuaBridge2 8的环境配置及简单应用 LuaBridge2 8下载链接 xff1a https github com vinniefalco LuaBridge tags 关于Lua的环境配置可参考以下链接 xff0
  • Lua 开发过程中常见坑

    Lua 开发过程中常见坑 Lua next span class token keyword return span G span class token punctuation span span class token function
  • 私网与公网地址转换

    私网与公网地址转换 NAT概述NAT功能静态NAT动态NATEASYIP xff08 多个内网地址对一个接口 xff09 PAT端口多路复用 NAT概述 NAT xff08 Network Address Translation xff0c
  • VWmare安装CentOS7及连接Xshell超详细过程(图文)

    VWmare安装CentOS7及连接Xshell超详细过程 xff08 图文 xff09 前言一 准备工作二 安装虚拟机过程 1 选择文件 xff0c 新建虚拟机 2 选择配置类型 3 自定义硬件配置 4 进入系统安装界面 二 连接Xshe
  • rpm与yum

    rpm与yum 前言一 应用程序与命令系统的关系二 典型应用程序的目录结构三 常见的软件封装类型四 rpm 1 概述 2 命令概述 3 查询rpm软件包信息 查询已安装的rpm软件信息 查询未安装的rpm软件包文件中的信息 安装 升级 卸载
  • Linux用户与权限管理

    Linux用户与权限管理 前言一 管理用户账号 1 用户账号概述 用户标识UID xff08 User IDentity xff0c 用户标识号 xff09 用户账号文件 2 用户账号管理 添加用户账号 xff08 useradd xff0
  • yum源仓库

    yum源仓库 前言一 yum介绍一 yum源的提供方式 1 配置本地仓库 2 配置ftp源 三 yum命令 1 yum常用的操作 2 搜索软件包命令 3 安装升级 4 软件卸载 5 yun history命令 总结 前言 yum相对与rpm
  • C++常见问题的总结

    1 C语言跟C 43 43 的关系 xff1a xff08 1 xff09 C语言跟C 43 43 的本质区别 xff1a 1 xff09 c更倾向于面向过程 xff0c c 43 43 是面向过程 43 面向对象 43 泛型编程 2 xf
  • Nginx Rewrite

    Nginx Rewrite 前言一 nginx rewrite概述 1 概述 2 跳转场景 3 跳转实现 4 rewrite实际场景 nginx跳转需要的实现方式 rewrite放在server if location 段中 对域名或参数字
  • Dockerfile概念简介

    Dockerfile概念简介 前言一 dockerfile概念二 Docker镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于dockerfile创建 dockerfile结构 xff08 四部分 xff09 构建镜像命令
  • 【云原生之k8s】k8s基础详解

    云原生之k8s k8s基础详解 前言一 kubernetes介绍 1 kubernetes简介 2 应用部署方式的演变 二 kubernetes组件 1 kubernetes架构 2 master组件 apiserver controlle
  • 【云原生之k8s】kubeadm搭建k8s集群

    云原生之k8s kubeadm搭建k8s集群 前言一 集群介绍 1 集群搭建方法 2 集群架构 二 集群部署 1 环境部署 所有节点 xff0c 关闭防火墙规则 xff0c 关闭selinux xff0c 关闭swap交换 修改主机名 xf
  • 【云原生之k8s】k8s管理工具kubectl详解

    云原生之k8s k8s管理工具kubectl详解 前言一 陈述式管理 1 陈述式资源管理方法 2 k8s相关信息查看 查看版本信息 查看节点信息 查看资源对象简写 查看集群信息 配置kubectl自动补全 查看日志 基本信息查看1 查看ma
  • 关于结构体指针与STM32外设的笔记

    96 define RCC RCC TypeDef RCC BASE xff09 96 逐步分解这句代码的含义 RCC TypeDef RCC BAS 其中 RCC BAS定义为 define RCC BASE AHBPERIPH BASE
  • visual studio与visual c++ 6.0的区别

    xfeff xfeff Visual Studio支持多种语言 xff0c Visual C 43 43 6 0 只支持C和C 43 43 Visual C 43 43 6 0 是Visual Studio 6 0的一个组成部分 xff0c

随机推荐

  • GD32F303 移植 FreeRTOS

    文章目录 1 准备工作1 1 软件版本1 2 源码下载1 3 基础工程 3 FreeRTOS 移植3 1 复制需要的内核文件3 2 添加文件到 Keil 工程3 3 添加 FreeRTOSConfig h 内核配置文件3 4 配置任务调度相
  • FreeRTOS 之 heap_4 踩坑之路

    参考博文连接 xff1a FreeRTOS系列 heap 4 c 内存管理分析FreeRTOS Heap 1 2 3 4 5 比较 示例工程代码库地址如下 xff1a GiteeGit 1 问题描述 博主在使用 heap 4 的 pvPor
  • GD32F30x Keil 环境下在 FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题(二)

    文章目录 1 问题描述1 1 环境1 2 问题 2 参考资料3 来龙去脉3 1 定位问题3 2 xPortPendSVHandler3 3 EXC RETURN3 4 寄存器3 5 探索真像3 5 1 浮点任务切换到空闲任务3 5 2 空闲
  • 辛勤劳作

    本文只有在12月27日可以学习到 我对敬业的体会是 xff1a 正在从事的工作就是自己的生命 xff0c 它意味着每周7天 xff0c 每年52周一心扑在上面 写下上面这句话 xff0c 我的泪水差一点儿就涌了出来 14年的寿险生涯 xff
  • 无人机开发资料推荐

    作者 xff1a BlueSky 链接 xff1a https www zhihu com question 30084079 answer 52762050 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c
  • STM32移植使用mbedtls-2.24.0

    STM32移植使用mbedtls 2 24 0 目录 STM32移植使用mbedtls 2 24 0 xff08 1 xff09 关于PolarSSL xff08 2 xff09 mbedtls移植 xff08 3 xff09 移植测试 扫
  • C++中的 ::

    C 43 43 中的双冒号 第一种 xff0c 类作用域 xff0c 用来标明类的变量 函数 Human span class token operator span span class token function setName sp
  • 算法的类型:

    所有的算法可以大概分为以下三种类型 xff1a 1 xff0e 贪婪算法 greedy algorithm 该算法每一步所做的都是当前最紧急 最有利或者最满意的 xff0c 不会考虑所做的后果 xff0c 直到完成任务 这种算法的稳定性很差
  • 平衡三棱柱原理

    先用一个例子来解释角动量守恒 大家一定都知道直升机 xff0c 直升机除了机身上方有一个大的螺旋桨外其尾部也有一个螺旋桨 这个螺旋桨的作用就是用来保持机身不会转动的 xff0c 如果没有它 xff0c 当直升机上方的螺旋桨转动时 xff0c
  • 自抗扰控制(ADRC)

    1 ADRC控制原理和结构 xff08 1 xff09 最速跟踪微分器 TD xff08 2 xff09 扩张状态观测器 ESO xff08 3 xff09 非线性状态误差反馈 NLSEF 2 ADRC控制仿真 xff08 1 xff09
  • 深度学习算法归类

    监督式学习 xff1a 逻辑回归 xff08 Logistic Regression xff09 和反向传递神经网络 xff08 Back Propagation Neural Network xff09 非监督式学习 xff1a Apri
  • DQN代码-ROS-turtlebot3

    DQN代码解析 代码来自turtlebot3 qdn environment stage 4 py 发布话题 xff1a cmd vel 订阅话题 xff1a odom 服务话题 gazebo reset simulation gazebo
  • js 事件流(冒泡、捕获)与绑定事件方法

    一 xff1a 事件流 事件流描述的是从页面中接收事件的顺序 但 IE 的事件流是事件冒泡流 xff0c 而 Netscape Communicator 的事件流是事件捕获流 1 事件冒泡 IE 的事件流叫做事件冒泡 xff0c 即事件开始
  • python获取当前文件的目录与路径

    绝对路径与相对路径概念 从C 写起的叫绝对路径C Users Sa07 PycharmProjects pythonProject 深度学习 mnist识别手写体 path catch py 绝对路径中包含某个项目 xff0c 我们截取到这
  • 微信小程序的校园求职招聘系统uniapp 附源码

    随着现代网络通信技术越来越深入而广泛的应用 xff0c 国内的招聘网站如雨春笋 xff0c 各种各样的招聘网站映入眼帘 网络上五花八门的企业使得应聘者无从下手 企业在选择应聘者时也只能了解基本情况 针对这些情况 xff0c 本网站做出相应调
  • 机械臂雅可比矩阵导数(未验证)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 求解方法二 代码总结 前言 GitHub上边抄的 xff0c 看了几个算法是一样的 xff0c 自己没有验证就拿来用了
  • ORB-SLAM2与OpenMVS对接实现三维重建

    详细介绍如何实现ORB SLAM2与OpenMVS的对接过程 xff0c 打通上下游实现三位重建 xff0c 二话不说先干图 对于学SLAM的同学对ORB SLAM2可能并不陌生 xff0c 系统框架清晰明了 xff0c 代码风格清新脱俗
  • 基于安卓AndroidStudio校园求职招聘app设计

    开发软件 xff1a Eclipse Idea 43 Android Studio 43 mysql 这是一个基于AndroidStudio前后端分离开发的校园大学生求职招聘app 后端使用java语言的Springboot框架开发 xff
  • 气压计MS5611

    经过几天的痛苦挣扎 终于搞定了 完成气压计的参数读写 xff0c 温度检测 xff0c 大气压计算 因为这款气压计精度高 xff0c 好多计算需要用到正负数 xff0c 整数小数 xff0c 浮点整形 xff0c 有的计算结果特别大 xff
  • Android 序列化Parcelable的使用详解

    背景 xff1a 在Java虚拟机中 xff0c 对象的传递称为数据传递不可或缺的一部分 xff0c 但如果一旦虚拟机停止工作 xff0c 该对象在内存中也就被释放 xff0c 地址空间不存在 xff0c 对象自然就不能再被重复利用 xff