首页 文章

使用带有Kotlin数据类的Parceler和用于序列化的构造函数

提问于
浏览
19

有没有办法使用Parceler与Kotlin数据类和构造函数进行序列化而不使用每个字段的 @ParcelProperty 注释?

如果我尝试使用这样的库:

@Parcel
data class Valve @ParcelConstructor constructor(val size: Int)

我得到 Error:Parceler: No corresponding property found for constructor parameter arg0 . 但是,如果我添加 @ParcelProperty("size") 它可以正常工作 .
这是为什么?

Update
还有其他方法可以使用此库 .
我可以删除 @ParcelConstructor 注释,但之后我会收到错误
Error:Parceler: No @ParcelConstructor annotated constructor and no default empty bean constructor found.
我认为(还没有测试过)我也可以使所有构造函数参数都可选并添加 @JvmOverloads 但是这有副作用,如果它们为null或者不是,我必须检查该类的所有属性 .

Update 2
这对我有用:

@Parcel
data class Valve(val size: Int? = null)

简而言之,生成的Java类必须具有默认的空构造函数 . 实现这一目标的一种方法是如上所述 - 所有变量都应该具有默认值 .

3 回答

  • 11

    根据文档,Parceler默认使用公共字段 . 但是通常的Kotlin data class (在你的例子中)更像是"traditional getter/setter bean",因为每个Kotlin属性都由私有字段和getter / [setter]表示 .

    TL; DR:我认为这会奏效:

    @Parcel(Serialization.BEAN)
    data class Valve(val size: Int = 10)
    

    注意默认值,它允许Kotlin自动生成一个额外的空构造函数,这是Java Been规范所要求的 .

    另一种方法是标记我们已经拥有的构造函数:

    @Parcel(Serialization.BEAN)
    data class Driver @ParcelConstructor constructor(val name: String)
    

    具体文件:https://github.com/johncarl81/parceler#gettersetter-serialization

  • 24

    我知道这个问题已经有了答案,但是对于那些也在努力让Parceler使用kotlin数据对象的未来 Spectator ,我写了一个新的注释处理器来为Kotlin数据类生成Parcelable样板 . 它旨在大规模减少样板代码,使您的数据类Parcelable:

    https://github.com/grandstaish/paperparcel

    Usage:

    使用 @PaperParcel 注释您的数据类,实现 PaperParcelable ,并添加生成的 CREATOR 的JVM静态实例,例如:

    @PaperParcel
    data class Example(
      val test: Int,
      ...
    ) : PaperParcelable {
      companion object {
        @JvmField val CREATOR = PaperParcelExample.CREATOR
      }
    }
    

    现在您的数据类是 Parcelable ,可以直接传递给 BundleIntent

    Edit: 使用最新的API进行更新

  • 4

    只需添加默认构造函数:

    @Parcel
    data class Valve(val size: Int) {
        constructor() : this(0)
    }
    

相关问题