Parcelize:Parcelable 实现生成器

Quibbler 6月前 339

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

        需要注意的是必须在主构造函数中声明所有序列化属性,且主构造函数中的参数必须都为valvar,否则不能使用@ParcelizeData 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

        

不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com