使用@Parcelize时如何在数据类中分解除构造函数以外的成员变量

时间:2018-11-15 04:00:57

标签: android serialization kotlin 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
}

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

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以通过documentation找到此信息:

  

@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
        }
    }
}

答案 1 :(得分:-1)

感谢@tynn提供参考。如果有人找不到解决方法,我还会发表另一篇文章。

@Entity(tableName = "Person")
@Parcelize
data class Test(@ColumnInfo(name = "name") var name:String,
           @PrimaryKey(autoGenerate = true)
           @ColumnInfo(name = "ID")
           var id: Long? = null) : Parcelable

您仍然可以创建没有ID的对象,例如Test("test name"),并且当该对象保存在ROOM中时,它将插入一个递增的值。