Kotlin的“@Parcelize”是否适用于非数据类?

我有简单的数据类。 我的意思是,他们是逻辑上的数据类,但不是data class ,因为我需要inheritance和其他构造函数。 他们只有字段(基本typesInt?String?List?等)和构造函数。

我需要通过他们(所有的领域需要通过)从活动到活动,所以我需要使他们parcellisable(或有更好的办法?)。 我首先创建它们作为data class ,只是添加@Parcelize 。 即使有一个警告和红线说“创造者”或什么的,我可以忽略他们和应用程序按预期工作。

但是,现在基于上述原因,我把它们改成了正常的类,突然间出现了编译错误。

 Error:java.util.NoSuchElementException: Collection contains no element matching the predicate. at org.jetbrains.kotlin.android.parcel.ParcelableCodegenExtension.getPropertiesToSerialize(ParcelableCodegenExtension.kt:374) ....too long... at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Error:Execution failed for task ':app:kaptGenerateStubsDebugKotlin'. Internal compiler error. See log for more details 

我怎么解决这个问题? 我应该使用data class吗? 但是我需要解析一个JSON对象来创建它们。 这些类看起来像这些(不是实际的类,但为简化说明)。 有没有更好的办法比手工实现那个无聊,庞大的可执行代码?

 @Parcelize open class Dog():Parcelable { var someField1; var someField2; constructor(data:JSON):this() { //parse data to set the fields. } } @Parcelize class Doge:Dog { var someField3; var someField4; constructor():super(); //I do not use it, but for parcellable constructor(data:JSON):super(data) { //parse data to set the fields. } } 

PS。 我不得不切换到PaperParcel。 这和Kotlin很相似,但是它不需要主要的构造函数。 它只需要相同的东西是任何构造函数,所以我可以创建一个二级构造函数与字段的参数名称相同,它的工作。 虽然,我想知道为什么CREATOR不能自动创建。

例如,

 @PaperParcel class Doge:Dog { var someField3; var someField4; //Needed only for PaperParcel constructor(someField3, someField4) { this.someField3 = someField3; this.someField4 = someField4; } companion object { @JvmField val CREATOR = PaperParcelDoge.CREATOR } //end of PaperParcel stuff. constructor(data:JSON):super(data) { //parse data to set the fields. } } 

如上所述,你的属性应该在你的主构造函数中声明。

可下载支持

Android扩展插件现在包含一个自动Parcelable实现生成器。 在主构造函数中声明序列化的属性,并添加一个@Parcelize注解,并自动创建writeToParcel()/ createFromParcel()方法:

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