Kotlin注解实现Parcelable序列化流程详解

目录
  • 一. 概念介绍
    • 1. 序列化
    • 2. 反序列化
    • 3. 实现序列化的条件
  • 二. 序列化目的
  • 三. 如何选择
  • 四. 进入主题

一. 概念介绍

1. 序列化

​ 由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化。

2. 反序列化

​ 反序列化恰恰是序列化的反向操作,也就是说,把已存在在磁盘或者其他介质中的对象,反序列化(读取)到内存中,以便后续操作,而这个过程就叫做反序列化。

3. 实现序列化的条件

​ 在Java中,一个对象要实现序列化操作,该类就必须实现了Serializable接口或者Parcelable接口,而Parcelable接口则是Android中特有的序列化接口。只要清楚知道实现序列化操作时必须实现Serializable接口或者Parcelable接口之一即可。

二. 序列化目的

(1)永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)

(2)通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的。因此序列化的目的是将对象数据转换成字节流的形式)

(3)将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作。在另一个Activity中需要进行反序列化操作讲数据取出)

(4)Java允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)

(5)序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化。(6)在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了。

三. 如何选择

​ Serializable是通过I/O读写存储在磁盘上的,使用反射机制,序列化过程较慢,且在序列化过程中创建许多临时对象,容易触发GC。Parcelable是直接在内存中读写的,将一个完整的对象分解成Intent所支持的数据类型,不需要使用反射,所以Parcelable具有效率高,内存开销小的优点。

​ 在Android日常开发中,为了方便实现序列化只需在实体类中实现Serializable接口即可,而实现Parcelable接口,则需要重写几个方法,较于复杂了些,如:

data class UserInfoBean(
    @SerializedName("address")
    val address: String?,
    @SerializedName("city")
    val city: String?,
    @SerializedName("createTime")
    val createTime: Int,
    @SerializedName("district")
    val district: String?,
    @SerializedName("id")
    val id: Int,
    @SerializedName("loginName")
    val loginName: String?,
    @SerializedName("mail")
    val mail: String?,
    @SerializedName("merchantId")
    val merchantId: Int,
    @SerializedName("phone")
    val phone: String?,
    @SerializedName("province")
    val province: String?,
    @SerializedName("remark")
    val remark: String?,
    @SerializedName("status")
    val status: Int,
    @SerializedName("updateTime")
    val updateTime: Int,
    @SerializedName("userName")
    val userName: String?
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readInt(),
        parcel.readString()
    )
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(address)
        parcel.writeString(city)
        parcel.writeInt(createTime)
        parcel.writeString(district)
        parcel.writeInt(id)
        parcel.writeString(loginName)
        parcel.writeString(mail)
        parcel.writeInt(merchantId)
        parcel.writeString(phone)
        parcel.writeString(province)
        parcel.writeString(remark)
        parcel.writeInt(status)
        parcel.writeInt(updateTime)
        parcel.writeString(userName)
    }
    override fun describeContents(): Int {
        return 0
    }
    companion object CREATOR : Parcelable.Creator<UserInfoBean> {
        override fun createFromParcel(parcel: Parcel): UserInfoBean {
            return UserInfoBean(parcel)
        }
        override fun newArray(size: Int): Array<UserInfoBean?> {
            return arrayOfNulls(size)
        }
    }
}

在Kotlin,实现Parcelable接口来序列化的复杂性已经不复存在了,进入主题,请看下文~

四. 进入主题

升级Kotlin Gradle plugins和Android Studio plugin的版本在1.3.60以上,实现方式:

在模块级的build.gradle中添加

apply plugin: 'kotlin-android-extensions'

android{
    androidExtensions {
        experimental = true
    }
}

在对象类中添加@Parcelize并实现Parcelable接口即可实现序列化(在低版本中可能存在警告忽略即可)。

​ 由于在 Kotlin 1.4.20 中做了一个重要的更新,影响如下:

废弃了 kotlin-android-extensions 编译插件Parcelable 相关的功能,移到了新的插件 kotlin-parcelize

Kotlin Gradle plugins 升级到1.4.20以后,作以下修改:

// apply plugin: 'kotlin-android-extensions'
// 改为
apply plugin: 'kotlin-parcelize'

在实体类导包中将 import kotlinx.android.parcel.Parcelize 修改为import kotlinx.parcelize.Parcelize,但是这一步不是必须的,kotlinx.android.parcel.Parcelize 可以继续使用,到目前为止还没有发现什么问题(PS: 如果出现问题,只需要将包名替换就好)

到此这篇关于Kotlin注解实现Parcelable序列化流程详解的文章就介绍到这了,更多相关Kotlin Parcelable内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin惰性集合操作之Sequence序列使用示例

    目录 集合操作函数 和 序列 序列中间和末端操作 创建序列 总结 集合操作函数 和 序列 在了解 Kotlin 惰性集合之前,先看一下 Koltin 标注库中的一些集合操作函数. 定义一个数据模型 Person 和 Book 类: data class Person(val name: String, val age: Int) data class Book(val title: String, val authors: List<String>) filter 和 map 操作: val

  • Kotlin的Collection与Sequence操作异同点详解

    目录 前言 累计 遍历 最大最小 过滤(去除) 映射 元素 排序&逆序 Sequence 的常见操作 区别与对比 总结 前言 在Android开发中,集合是我们必备的容器,Kotlin的标准库中提供了很多处理集合的方法,而且还提供了两种基于容器的工作方式:Collection 和 Sequence. Collection 是我们常见的,而 Sequence 确是我们少见的,甚至很多人都没有听说过(是的,说的就是我 ) 本篇文章就来介绍一下常用的一些集合操作符,以及 Collection 与 Se

  • Kotlin中的惰性操作容器Sequence序列使用原理详解

    目录 Sequence序列 执行的顺序 只做最少的操作 序列可以是无限的 序列不会在每个步骤创建集合 Sequence的基本使用 序列的创建 序列的操作 Sequence源码分析 Sequence是什么? 序列的创建方式分析 序列的惰性原理 总结 Sequence序列 Sequence 是Kotlin标准库提供的一种容器类型.它和Iterable一样具备对集合进行多步骤操作能力,但是却是采用了一种完全不同于Iterable的实现方式: val map = (0..3).filter { prin

  • Android中Serializable和Parcelable序列化对象详解

    本文详细对Android中Serializable和Parcelable序列化对象进行学习,具体内容如下 学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.Parcelable的工作原理 6.相关实例  1.序列化的目的 1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中 2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以

  • Kotlin startActivity跳转Activity实现流程详解

    目录 带参数的调整 自定义数据传输 startActivityForResult 小结 从一个Activity跳到另一个Activity 在编写安卓代码是最常见的事情了.我们不可能在一个页面中,把所有的事情都做完. 在kotlin中跳转的程序也比较简单,跟java差不多.如果熟悉java代码的话,只需要把代码改变过来而已. 带参数的调整 从一个Activity跳到另一个Activity 中,如同调用函数一样,可以把数据传递给另外的Activity中,Activity在接受到这个数据后,可以根据数

  • Android中Parcelable的使用详解

    Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口. Parcelable是Android为我们提供的序列化的接口. 对比: 1.Parcelable相对于Serializable的使用相对复杂一些. 2.Parcelable的效率相对Serializable也高很多. 3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下不能很好的保证数据的持续性.尽管Serializable

  • 在IDEA中maven配置MyBatis的流程详解

    一.MyBatis简介 1)MyBatis 是一款优秀的持久层框架 2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 3)MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 [Plain Old Java Objects,普通的 Java对象]映射成数据库中的记录. 如果想了解maven请转到我的上一篇文章中: 二.MyBatis获取 1)在这个网址下获取MyBatis:https://mvnrepositor

  • SpringMvc框架的简介与执行流程详解

    目录 一.SpringMvc框架简介 1.Mvc设计理念 2.SpringMvc简介 二.SpringMvc执行流程 1.流程图解 2.步骤描述 3.核心组件 三.整合Spring框架配置 1.spring-mvc配置 2.Web.xml配置 3.测试接口 4.常用注解说明 四.常见参数映射 1.普通映射 2.指定参数名 3.数组参数 4.Map参数 5.包装参数 6.Rest风格参数 五.源代码地址 一.SpringMvc框架简介 1.Mvc设计理念 M:代表模型Model 模型就是数据,应用

  • Kotlin lateinit与by lazy案例详解

    lateinit 和 lazy 是 Kotlin 中的两种不同的延迟初始化的实现 lateinit 只用于变量 var,而 lazy 只用于常量 val lazy 应用于单例模式(if-null-then-init-else-return),而且当且仅当变量被第一次调用的时候,委托方法才会执行. lazy()是接受一个 lambda 并返回一个 Lazy <T> 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lambda 表达式并

  • springboot整合mybatis流程详解

    目录 1.mybatis是什么 2.整合 2.1 导入依赖 2.2 创建包和类 2.3 在application.yaml配置mybatis 3.使用注解版mybaits 4.实战过程 1.mybatis是什么 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型.接口和 Java POJO(Plain Old Java

  • Spring利用注解整合Mybatis的方法详解

    目录 一.环境准备 步骤1:数据库相关 步骤2:导入jar包 步骤3:创建模型类 步骤4:创建Dao接口和实现类 步骤5:创建Service接口和实现类 步骤6:添加jdbc.properties文件 步骤7:添加Mybatis核心配置文件 步骤8:编写测试程序 二.整合思路分析 三.整合步骤 步骤1:导入整合jar包 步骤2:创建数据源配置类 步骤3:创建Mybatis配置类 步骤4:创建Spring主配置类 步骤5:编写运行程序 一.环境准备 步骤1:数据库相关 建库建表 创建spring_

  • Flask实现swagger在线文档与接口测试流程详解

    目录 1.什么是restful 2.swagger/openAPI能做什么 3.python如何实现swagger 4.flasgger的使用案例 5.完整代码 阅读对象:知道什么是restful,有了解swagger或者openAPI更佳. 1.什么是restful Representional State Transfer(REST):表征状态转移.是一种一种基于HTTP协议的架构.采用Web 服务使用标准的 HTTP 方法 (GET/PUT/POST/DELETE) 将所有 Web 系统的

  • Kotlin协程Dispatchers原理示例详解

    目录 前置知识 demo startCoroutineCancellable intercepted()函数 DefaultScheduler中找dispatch函数 Runnable传入 Worker线程执行逻辑 小结 前置知识 Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中.所以从本质上讲,Kotlin和Java是类似的,都是可以编译产生class的语言,但最终还是会受到虚拟机的限制,它们的代码最终会在虚拟机上的某个线程上被执行. 之

随机推荐