出于某种原因,每当我尝试访问 init block 内的可序列化类的属性时,只会打印默认值。我正在使用 firebase 将数据读入此类,该类按预期工作。我想根据venueName参数更改类的 bool 值,但不能,因为仅访问默认 field 名称
class Venue(val venueName: String = "defaultName", val venueImageUrl: String = "", var venueImageName: String = "", val events: List<Event> = emptyList(), var isAd: Boolean = false, var isPromoVenue: Boolean = false
) : Serializable {
val vName = venueName
init {
println(vName)
}
}
#prints("defaultName") for each object created.
最佳答案
文档中的引用
意味着该实例是使用默认构造函数通过反射创建的(相当于本例中的Venue()
),然后将执行任何init
block 。在构造实例之后,字段也是通过反射设置的(因为不需要 setter )。
Serialized
在这里不应该相关(但它自己的机制根本不调用 Venue
的构造函数,因此您甚至不会看到 defaultName
打印)。
作为解决方法,您可以创建一个不带 init
的帮助器类
class VenueDTO(val venueName: String = "defaultName", val venueImageUrl: String = "", val venueImageName: String = "", val events: List<Event> = emptyList(), val isAd: Boolean = false, val isPromoVenue: Boolean = false) : Serializable {
val asVenue get() = Venue(this)
}
class Venue(val asDto: VenueDTO) {
val vName = venueName
init {
println(vName)
}
}
将 VenueDTO
存储在 Firebase 中,并在检索后立即将其转换为 Venue
。
关于firebase - Kotlin - 可序列化类中的初始化 block 只能读取默认属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253019/