当前位置: 首页 > news >正文

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还是会出现异常。

复杂对象测试

 

简单对象

 

四、 总结

        通过原生手写和注解两种对比,我还是建议大家不要通过注解去完成,因为出现问题无法排查,浪费时间。特别是新手,很容易被绕进去,找不到问题。

不要使用注解,不要使用注解,不要使用注解。重要事情说三遍

http://www.lryc.cn/news/92468.html

相关文章:

  • C++ 类设计的实践与理解
  • 循环链表的创建
  • 如何让GPT的回答令人眼前一亮,不再刻板回复!
  • JMeter测试笔记(四):逻辑控制器
  • 【计算机组成原理·笔记】I/O接口
  • MIT6.024学习笔记(二)——图论(1)
  • 饼状图使用属性时,使用驼峰命名法
  • 使用Spring Boot、Spring Security和Thymeleaf的整合示例
  • Linux--ServerProgramming--(7)IPC
  • 最优化理论-KKT定理的推导与实现
  • chatgpt赋能python:Python中引入其他包的指南
  • 设计模式-组合模式
  • DMBOK知识梳理for CDGA/CDGP——第四章 数据架构(附常考知识点)
  • MyBatisPlus总结(1.0)
  • 职场老油条表示真干不过,部门新来的00后测试员已把我卷崩溃,想离职了...
  • 【每日挠头算法题(1)】——旋转字符串|亲密字符串
  • 什么是 tokens,ChatGPT里面的Tokens如何计数?
  • 工业镜头分类、相关参数含义
  • 码蹄杯语言基础:数组(C语言)
  • DJ4-2 程序的装入和链接
  • 开源项目合集....
  • 机器学习 | 降维问题
  • Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例
  • Snipaste工具推荐
  • MinIO快速入门——在Linux系统上安装和启动
  • 07.JavaWeb-Vue+elementUI
  • 经典面试题---【第一档】
  • 欧美同学会第三届“双创”大赛——空天装备产业赛区(浙江诸暨)正式启动,开启报名通道
  • python3 爬虫相关学习8:python 的常见报错内容 汇总收集
  • 活跃主机发现技术指南