firebase - Kotlin - 可序列化类中的初始化 block 只能读取默认属性值

标签 firebase class kotlin firebase-realtime-database serialization

出于某种原因,每当我尝试访问 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. 

最佳答案

文档中的引用

Pass a custom Java object, if the class that defines it has a default constructor that takes no arguments and has public getters for the properties to be assigned.

意味着该实例是使用默认构造函数通过反射创建的(相当于本例中的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/

相关文章:

javascript - 从 Polymer 元素内写入 Firebase

android - 如何在 Kotlin 中使用 getDeclaringClass?

java - 如何保护 Android 中的资源

android - Android中逗号后面的Kotlin加倍为4

android - 什么是 Firebase 远程配置开发者模式

javascript - Firebase 身份验证 Javascript : setCookie for pending Credential for redirect

android - Firebase 测试实验室的测试运行失败

c# - 来自类结构的类使用细节

java - 为什么使用子类方法定义?

java - 使用反射检索对象的类名