Firebase Serializable类中的Kotlin-Init块只能读取默认属性值
出于某种原因,每当我试图访问init块内部这个可序列化类的属性时,只打印默认值。我正在使用firebase将数据读入到这个类中,这个类正在按预期工作。我想根据VenuName参数更改该类的布尔值,但无法更改,因为只访问默认的场馆名称Firebase Serializable类中的Kotlin-Init块只能读取默认属性值,firebase,class,kotlin,firebase-realtime-database,serialization,Firebase,Class,Kotlin,Firebase Realtime Database,Serialization,出于某种原因,每当我试图访问init块内部这个可序列化类的属性时,只打印默认值。我正在使用firebase将数据读入到这个类中,这个类正在按预期工作。我想根据VenuName参数更改该类的布尔值,但无法更改,因为只访问默认的场馆名称 class Venue(val venueName: String = "defaultName", val venueImageUrl: String = "", var venueImageName: String = "", val events: List&
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.
上课地点(val-venueName:String=“defaultName”,val-venueImageUrl:String=“”,var-venueImageName:String=“”,val-events:List=emptyList(),var-isAd:Boolean=false,var-isPromoVenue:Boolean=false
):可序列化{
val vName=venueName
初始化{
println(vName)
}
}
#为创建的每个对象打印(“默认名称”)。
此引用自文档
表示实例是使用默认构造函数通过反射创建的(在本例中相当于Venue()
),然后将执行任何init
块。构造实例后,字段也由反射设置(因为不需要setter)
Serializable
在这里应该不相关(但它自己的机制根本不调用vention
的构造函数,所以你甚至看不到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(val-venueName:String=“defaultName”,val-venueImageUrl:String=“”,val-venueImageName:String=“”,val-events:List=emptyList(),val-isAd:Boolean=false,val-isPromoVenue:Boolean=false):可序列化{
val asVenue get()=场地(此)
}
上课地点(val asDto:VenueDTO){
val vName=venueName
初始化{
println(vName)
}
}
将VenueDTO
存储在Firebase中,并在检索到后立即将其翻译到VenueDTO
。非常感谢!只是想知道是否有任何方法可以覆盖读取对象方法?“是否有任何方法可以覆盖读取对象方法”Serializable使用的方法是的,但如上所述,Firebase可能不使用它。