使用@Parcelize 时如何对数据类中的构造函数以外的成员变量进行打包

sad*_*dat 6 android parcelable kotlin kotlin-android-extensions android-room

我正在使用 Room 和 Kotlin 数据类。如,

@Entity(tableName = "Person")
@Parcelize
class Test(@ColumnInfo(name = "name") var name:String) : Parcelable{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "ID")
    var id: Long? = null
}
Run Code Online (Sandbox Code Playgroud)

我可以使用构造函数创建实例并插入数据。我也收到警告"property would not be serialized into a 'parcel'"。当我试图通过一个包发送对象时,id 丢失了,正如警告所说的那样。如何ID在包裹中添加该成员?我没有在构造函数中保留 ID,因为我希望它们自动生成。

tyn*_*ynn 9

您可以在文档中找到此信息:

@Parcelize要求在主构造函数中声明所有序列化属性。Android 扩展将在每个属性上发出警告,并在类主体中声明一个支持字段。此外,@Parcelize如果某些主要构造函数参数不是属性,则无法应用。

如果你的类需要更高级的序列化逻辑,你可以将它写在一个伴生类中:

@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
    private companion object : Parceler<User> {
        override fun User.write(parcel: Parcel, flags: Int) {
            // Custom write implementation
        }

        override fun create(parcel: Parcel): User {
            // Custom read implementation
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 文档的新链接 - https://kotlinlang.org/docs/reference/compiler-plugins.html#parcelable-implementations-generator (2认同)