Android kotlin序列化之Parcelable详解与使用(二)
一、介绍
注解序列化篇:Android kotlin序列化之@Parcelize详解与使用_蜗牛、Z的博客-CSDN博客
通过上一篇注解序列化,我们已了解的kotlin的序列化比Java复杂了很多。而且有好多问题,注解虽好,但是存在一些问题。
一般在大型商业项目开发过程中,我们不仅追求极致的开发技术,更重视软件质量。过于风骚的技术同样有潜在的风险,这个时候我们还是回到本质。
二、手写Parcelable序列化
这边直接上代码:
class Car(var logo:String?="") :Parcelable{var name:String?=""var numbe:Int=0constructor(parcel: Parcel) : this(parcel.readString()) {name = parcel.readString()numbe = parcel.readInt()}override fun writeToParcel(parcel: Parcel, flags: Int) {parcel.writeString(logo)parcel.writeString(name)parcel.writeInt(numbe)}override fun describeContents(): Int {return 0}companion object CREATOR : Parcelable.Creator<Car> {override fun createFromParcel(parcel: Parcel): Car {return Car(parcel)}override fun newArray(size: Int): Array<Car?> {return arrayOfNulls(size)}}}
只要继承Parcelable,IDE可以自动完成,接下来就是测试。
关于CREATOR 写法有两种
1、第一种
companion object CREATOR : Parcelable.Creator<Car> {override fun createFromParcel(parcel: Parcel): Car {return Car(parcel)}override fun newArray(size: Int): Array<Car?> {return arrayOfNulls(size)}}
2、第二种
companion object {@JvmFieldval CREATOR = object : Parcelable.Creator<Car> {override fun createFromParcel(parcel: Parcel): Car {return Car(parcel)}override fun newArray(size: Int): Array<Car?> {return arrayOfNulls(size)}}}
如果你的类中需要有其他方法加入伴生对象中,当前采用第一种无法扩展,因为一个类中只能有一个伴生对象,所以建议第二种写法。
三、复杂类序列化
简单类很好处理,即使使用注解也能完成,但是复杂对象的封装,注解存在问题。这就是我们为什么用原生继承写法。
Demo:
class TestCar() :Parcelable{var car:Car?=nullvar list= mutableListOf<Car>()constructor(parcel: Parcel) : this() {car = parcel.readParcelable(Car::class.java.classLoader)parcel.readTypedList(list,Car.CREATOR)}@RequiresApi(Build.VERSION_CODES.Q)override fun writeToParcel(parcel: Parcel, flags: Int) {parcel.writeParcelable(car, flags)parcel.writeTypedList(list)}override fun describeContents(): Int {return 0}companion object CREATOR : Parcelable.Creator<TestCar> {override fun createFromParcel(parcel: Parcel): TestCar {return TestCar(parcel)}override fun newArray(size: Int): Array<TestCar?> {return arrayOfNulls(size)}}}
这样我们就完成了复杂的对象封装。
注意:
不要将注解类和非注解对象混合在一起使用。这样如果涉及到对象A是对象B的变量,那么序列化对象B还是会出现异常。
四、 总结
通过原生手写和注解两种对比,我还是建议大家不要通过注解去完成,因为出现问题无法排查,浪费时间。特别是新手,很容易被绕进去,找不到问题。
不要使用注解,不要使用注解,不要使用注解。重要事情说三遍
相关文章:
Android kotlin序列化之Parcelable详解与使用(二)
一、介绍 注解序列化篇:Android kotlin序列化之Parcelize详解与使用_蜗牛、Z的博客-CSDN博客 通过上一篇注解序列化,我们已了解的kotlin的序列化比Java复杂了很多。而且有好多问题,注解虽好,但是存在一些问题。 一般在大型商业…...
C++ 类设计的实践与理解
前言 C代码提供了足够的灵活性,因此对于大部分工程师来说都很难把握。本文介绍了写好C代码需要遵循的最佳实践方法,并在最后提供了一个工具可以帮助我们分析C代码的健壮度。 1. 尽可能尝试使用新的C标准 到2023年,C已经走过了40多个年头。新…...
循环链表的创建
循环链表的介绍及创建(C语言代码实现) 点击打开在线编译器,边学边练 循环链表概念 对于单链表以及双向链表,其就像一个小巷,无论怎么样最终都能从一端走到另一端,然而循环链表则像一个有传送门的小巷&…...
如何让GPT的回答令人眼前一亮,不再刻板回复!
我们平常在使用GPT的时候,是否觉得它的回复太过于死板、官方化,特别是用于创作、写论文分析的时候,内容往往让读者提不起兴趣、没有吸引人的地方,甚至有些内容百度都可以搜到。 举个例子,如下图: 问GPT,AI…...
JMeter测试笔记(四):逻辑控制器
引言: 进行性能测试时,我们需要根据不同的情况来设置不同的执行流程,而逻辑控制器可以帮助我们实现这个目的。 在本文中,我们将深入了解JMeter中的逻辑控制器,包括简单控制器、循环控制器等,并学习如何正…...
【计算机组成原理·笔记】I/O接口
I/O接口 概述I/O接口的功能和组成 I/O接口的组成I/O接口的功能 I/O接口类型 按数据传送方式按功能灵活性按通用性按数据传输的控制方式 概述 I/O接口通常是指主机与I/O设备之间设置的硬件电路以及相应的软件控制,主机通过I/O接口和I/O设备相连接。 I/O接口的功…...
MIT6.024学习笔记(二)——图论(1)
学习不是为了竞争和战胜他人,而是为了更好地了解自己和世界。 - 达赖喇嘛 文章目录 图的相关概念涂色问题基础涂色方法(贪婪算法)证明 二分图匹配问题应用:稳定婚烟问题算法性质及其证明 图的相关概念 图的定义:一组&…...
饼状图使用属性时,使用驼峰命名法
饼状图是使用D3.js等JavaScript库来绘制的,而JavaScript中的属性名通常采用驼峰式命名法,即第一个单词的首字母小写,后面单词的首字母大写,例如fontSize、fontWeight等。而CSS中的属性名采用连字符命名法,即单词之间用…...
使用Spring Boot、Spring Security和Thymeleaf的整合示例
使用Spring Boot、Spring Security和Thymeleaf的整合示例 大纲: 创建Spring Boot项目 集成Thymeleaf作为模板引擎 配置Spring Security实现身份验证和授权 创建登录页面和主页 创建管理员页面和普通用户页面 实现用户角色和权限管理 详细步骤: 创建Sprin…...
Linux--ServerProgramming--(7)IPC
1.管道 2.信号量 2.1 概念 信号量 是一个计数器,用于实现进程间互斥和同步。 信号量的取值可以是任何自然数。 最简单的信号量是只能取 0 和 1 的变量,这也是信号量最常见的一种形式,叫做二进制信号量(Binary Semaphore&#…...
最优化理论-KKT定理的推导与实现
目录 一、引言 二、最优化问题的基本概念 三、KKT条件的引入 1. 梯度条件 2. 原始可行性条件 3. 对偶可行性条件 四、KKT定理的表述 五、KKT定理的证明 1. 构造拉格朗日函数 2. 构造拉格朗日对偶函数 3. 推导KKT条件 4. 解释KKT条件 六、KKT定理的应用 七、总结 …...
chatgpt赋能python:Python中引入其他包的指南
Python中引入其他包的指南 Python是一种流行的编程语言,拥有丰富的开源软件包和库。许多Python程序将使用其他包来增强其功能。在本文中,我们将探讨如何在Python项目中使用和引入其他包。 什么是Python包和库? Python包是一组可重复使用的…...
设计模式-组合模式
应用场景 实现规则匹配的逻辑 比如> <,同时支持 and or 多个条件组合 新增一个条件就增加一个实现类 说明 对于这种需要实现规则匹配的逻辑,可以考虑使用策略模式。策略模式可以将不同的算法封装成不同的策略类,让它们可以相互替换,…...
DMBOK知识梳理for CDGA/CDGP——第四章 数据架构(附常考知识点)
关 注ghz“大数据食铁兽”,回复“知识点”获取《DMBOK知识梳理for CDGA/CDGP》常考知识点(第四章 数据架构) 第四章 数据架构 第四章是CDGA|CDGP考试的重点考核章节之一,分值占比高,知识点比较密集,重点…...
MyBatisPlus总结(1.0)
MyBatis-Plus MyBatis-Plus介绍 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生 特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影…...
职场老油条表示真干不过,部门新来的00后测试员已把我卷崩溃,想离职了...
在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&#x…...
【每日挠头算法题(1)】——旋转字符串|亲密字符串
文章目录 一、旋转字符串思路1思路2 二、亲密字符串思路 总结 一、旋转字符串 点我直达终点~ 思路1 前提:如果s串和goal串长度不等,则goal串不可能是s串旋转得来,直接返回false; 通过观察,可以发现每旋转一次&#…...
什么是 tokens,ChatGPT里面的Tokens如何计数?
什么是 tokens,ChatGPT里面的Tokens如何计数? 什么是 tokens? Tokens 可以被认为是词语的片段。在 API 处理提示之前,输入会被分解成 tokens。这些 tokens 并不会精确地在单词的开始或结束处切分 - tokens 可以包含尾随的空格甚…...
工业镜头分类、相关参数含义
一、工业镜头参数 1、焦距/后焦距 焦距是像方主面到像方焦点的距离。后焦距指光线离开镜头最后一片镜片表面到sensor感光面的距离,如8mm,16mm,25mm等; 焦距的大小决定着视角大小,焦距数值小,视角大&#…...
码蹄杯语言基础:数组(C语言)
码蹄集网站地址:https://www.matiji.net/exam/ojquestionlist ⭐MT1381逆序输出数组 定义一个长度为10的整型数组,输入10个数组元素的值,然后逆序输出他们 格式 输入格式: 输入10个数组元素的值,整型,空…...
DJ4-2 程序的装入和链接
目录 4.2.1 程序的装入 一、绝对装入方式 二 、可重定位装入方式 三、动态运行时装入方式 4.2.2 程序的链接 一、静态链接 二、装入时动态链接 三、运行时动态链接 在多道程序环境下,如果程序要运行,那么必须为之创建进程。而创建进程的第一件…...
开源项目合集....
likeshop开源商城系统,公众号商城、H5商城、微信小程序商城、抖音小程序商城、字节小程序商城、头条小程序商城、安卓App商城、苹果App商城代码全开源,免费商用。 适用场景:B2C商城、新零售商城、社交电商商城、分销系统商城、小程序商城、商…...
机器学习 | 降维问题
目录 一、主成分分析 二、奇异值分解 2.1 奇异值分解原理 2.2 奇异值分解实践 三、特征值与特征向量 一、主成分分析 主成分有如下特征: 每个主成分是原变量的线性组合;各个主成分之间互不相关;主成分按照方差贡献率从大到小依次排列&…...
Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例
文章目录 1.1 准备服务器的基本信息1.2 操作系统上创建其用户1.3 部署MongoDB服务端1.4 部署MongoDB客户端1.5 部署MongoDB 27017实例1.5.1 创建相关目录1.5.2 准备配置文件1.5.3 准备启停脚本1.5.4 进行启停测试1.5.5 加入开机自启动 1.6 创建超级管理员用户1.6.1 创建本地的超…...
Snipaste工具推荐
Snipaste Snipaste 不只是截图,善用贴图功能将帮助你提升工作效率! 新用户? 截图默认为 F1,贴图为 F3,然后请对照着 快捷键列表 按一遍,体会它们的用法,就入门啦! 遇到了麻烦&…...
MinIO快速入门——在Linux系统上安装和启动
1、简介 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。MinIO系统,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 2、环境搭建&#…...
07.JavaWeb-Vue+elementUI
1.Vue 功能替代JavaScript和jQuery,基于JavaScript实现的前端框架 1.1配置Vue 1.1.1引入vue库 方法一:通过cdn链接引入最新版本的vue(可能会慢些) <head><script src"https://cdn.jsdelivr.net/npm/vue">…...
经典面试题---【第一档】
1.如果你想new一个Quene,你有几种方式?他们之间的区别是什么? 2.Redis 是如何判断数据是否过期的呢? Redis 通过一个叫做过期字典(可以看作是 hash 表)来保存数据过期的时间。过期字典的键指向 Redis 数据…...
欧美同学会第三届“双创”大赛——空天装备产业赛区(浙江诸暨)正式启动,开启报名通道
6月8日,欧美同学会第三届“双创”大赛——空天装备产业赛区(浙江诸暨)启动仪式暨北京推介会圆满举行。活动由欧美同学会(中国留学人员联谊会)主办,中共浙江省委统战部支持,浙江省欧美同学会、中…...
python3 爬虫相关学习8:python 的常见报错内容 汇总收集
目录 1 拼写错误 AttributeError: NameError: 等等 2 类型错误 TypeError: 如字符串连接错误 TypeError: can only concatenate str (not “int“) to str 3 意外缩进 IndentationError: unexpected indent 4 找不到对应模块 ModuleNotFoundError: 5 语法错误 Syntax…...
龙口网站开发/肇庆网络推广
最近正在重新学习JVM的内存结构及相关优化内容,无意中看到IDEA的VM配置(安装时默认配置)中有如下的配置: # custom IntelliJ IDEA VM options-Xms2048m -Xmx2048m 看到Xms和Xmx的一样,是不是稍微有些奇怪?…...
wordpress用的什么框架/seo排名点击器
策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。举一个示例来说:一个代理机票系统,普通用户和vip用户都可以有三种预定和支付方式。按照普…...
wordpress做了个站没流量/怎么能在百度上做推广
我们使用的app大多都有分享的功能,我们可以选择分享到不同的地方,比如微博、微信、QQ等等,虽然是同一个内容,但是分享到不同的平台就会有不同的处理方式,比如要跳转到不同的app或者直接复制链接等等。如果让你来实现这…...
科技设计网站/广州网站优化方案
实验 1 图灵机模型与计算机硬件系统虚拟拆装 实验报告学号 1500202151 姓名 叶思凡 班级: 卫生检验与检疫 15 实验时间: 2017 年 2月 23 日实验报告表 1-1 图灵机模型中的主要组成部分及作用主要组成部分作用名称无限长的纸带 用于记录输入或输出数据&am…...
网络营销的主要内容是什么/搜索关键词排名优化
为了让我们的信息能够有效地沟通,我们需要创建用户和我们的媒体之间的强有力的联系。今天我们就来探讨在网络上呈现故事的新方法,并为此创造了一个开源和免费使用的 JavaScript 库称为 space.js。该库是 HTML 驱动的,这意味着你不需要在网站上…...
网站 数据库选择/google seo 优化教程
1,基本了解: tftp是基于UDP来下载远程文件的网络协议。 作用:比较好适用于初始化时下载少量的文件数据。比如内核和设备树。 当有大量文件且会有定时的新文件加入调试的话,使用nfs的创建的共享目录较好。所以一般将制作好的根文件…...