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