firebase数据库:与Kotlin委托属性的模型

我正在使用Kotlin对象来处理我的Firebase数据库模型,如指南中所述 。 我有很多字段存储为字符串,但实际上是枚举,所以为了types安全我有枚举字段在模型中,再加上一个字符串委托属性,返回firebase存储的值(如问我建议问了一些问题前)。 现在,如果我在代码中获取/设置字符串委托,这些字段可以工作,但是当从/从数据库的json格式转换时,firebase库似乎跳过它们。

一个简单的例子:

abstract class BaseModel { @Exclude open var path: String? = null // fails even if I delete this field! } class Weight() : BaseModel() { constructor(v: Double, u: WeightUnit) : this() { value = v unitEnum = u } var value: Double = 0.0 @Exclude var unitEnum: WeightUnit = WeightUnit.KG var unit: String by EnumStringLowercaseConverter(WeightUnit::class.java).getDelegate(Weight::unitEnum) } [...] val testWeight = Weight(7.0, "kg") db.getReference("/valid/path/to/save/testWeight").setValue(testWeight) .addOnSuccessListener { r -> Log.d(LOG_TAG, "set successful") } .addOnFailureListener { e -> Log.e(LOG_TAG, "set error", e) } 

setValue总是给出一个Permission Denied错误,但工作,如果我删除unitEnum字段,并使unit一个正常的String属性。

阅读相似:Firebase在获取Weight对象时不会产生错误,但weightUnit字段从不设置为默认值。 但是,如果我手动做weight.unit = "lb"unitEnum字段正确返回WeightUnit.LB

我正在使用的Firebase的libs v10.0.1

现在,问题是:

  • 我能做些什么来使委派的属性与Firebase正常工作? 只要我的原始问题得到满足(可读,简洁和types安全的代码),我可以尝试不同的方法来委托枚举字段。
  • 有什么方法可以看到firebase库是如何将对象转换为json的? 或者至少看到转换后的json? 也许我可以自己调整一下。 不幸的是,所有与firebase有关的东西都显示为AndroidStudio中的/* compiled code */

更新 :当然,我可以添加一个toMap()方法到每个模型,在那里我会构建一个包含toMap()所需的所有属性的地图,但是对于每个模型都这样做会很麻烦,而且它只解决了存储问题,获取时枚举字段仍然不会被设置。

使用GSON序列化时,也会跳过委托的道具。 所以也许有一种通用的方式,使委派的属性看起来像普通的领域?

试试这个代码,它应该工作。

 @get:Exclude @set:Exclude var unitEnum: WeightUnit = WeightUnit.KG var unit: String get() = unitEnum.name set(v) { unitEnum = WeightUnit.valueOf(v) }