Parcelize:Parcelable 实现生成器

QuibblerQuibbler 2023-10-29 约 7 分钟 2558 次阅读

Parcelize:Parcelable 实现生成器

Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。

1、Parcelize插件

Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。

1.1、引入插件

在项目的build.gradle中添加:id("kotlin-parcelize"),使用此Gradle插件:

plugins {
	id 'com.android.application'
	id 'org.jetbrains.kotlin.android'
	id("kotlin-parcelize")
    }

1.2、支持的类型

支持多种类型数据的Parcelable序列化,如果有不支持的类型可以自定义Parceler,参考2.2节。

  • 基元类型(及其 boxed 版本)
  • 对象和枚举
  • String、CharSequence
  • Exception
  • Size、SizeF、Bundle、IBinder、IInterface、FileDescriptor
  • SparseArray、SparseIntArray、SparseLongArray、SparseBooleanArray
  • 所有 Serializable(包括 Date)和 Parcelable 实现
  • 所有受支持类型的集合
  • 所有受支持类型的数组
  • 所有受支持类型的可为 null 版本

2、使用Parcelize进行序列化

2.1、使用@Parcelize注解

只需使用@Parcelize为类添加注解,系统会自动生成一个Parcelable实现:

@Parcelize
    data class User(
        val firstName: String,
        val lastName: String) : Parcelable

需要注意的是必须在主构造函数中声明所有序列化属性,且主构造函数中的参数必须都为val或var,否则不能使用@Parcelize:Data class primary constructor must only have property (val / var) parameters。

2.2、自定义Parceler

如果要序列化的类中有属性不是被支持的类型,会报错:Type is not directly supported by 'Parcelize'. Annotate the parameter type with '@RawValue' if you want it to be serialized using 'writeValue()'。

@Parcelize
    data class User(val externalClass: ExternalClass) : Parcelable
    
    //上面需要序列化的类主构造参数类型是 另一个不能被支持序列化的自定义类
    data class ExternalClass(val value: Int)

这时候需要自定义Parceler以支持该类型,只需定义一个object,继承自Parceler<T>手动实现序列化方法create(parcel: Parcel)和write(parcel: Parcel, flags: Int)。

object ExternalClassParceler : Parceler<ExternalClass> {
        override fun create(parcel: Parcel): ExternalClass {
            return ExternalClass(parcel.readInt())
        }
        override fun ExternalClass.write(parcel: Parcel, flags: Int) {
            parcel.writeInt(value)
        }
    }

再将其应用到@Parcelize注解的需要序列化的类中,有以下三种应用方式:

// 使用@TypeParceler注解
    @Parcelize
    @TypeParceler<ExternalClass, ExternalClassParceler>()
    class MyClass(val external: ExternalClass) : Parcelable

    //在属性中应用@TypeParceler注解
    @Parcelize
    class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass) : Parcelable

    //使用@WriteWith注解传入自定义的Parceler
    @Parcelize
    class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass) : Parcelable

类似自动实现Parcelable的注解还有github上的/johncarl81/parceler。

相关资料:

        kotlin-parcelize plugin

        Parcelable implementation generator

        

相关推荐

Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.1k
 Kotlin基本语法
Kotlin

Kotlin基本语法

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

2.1k
Kotlin循环语句
Kotlin

Kotlin循环语句

Kotlin循环语句每门语言都要学一下循环语句,虽然每种语言都有for、while等循环,但总有些各自的特色。1、for循环for循环遍历集合或者数组,使用 in 关键字遍历任何提供迭代器。语法:例:先定义一个数组或集合array:遍历集合array:通常还需要用到索引index,调用集合的withIndex()方法参与循环遍历。例:使用下面的方式遍历for循环,同时获取元素当前索引index和当

2.1k