如何使用 getValue(子类.class) 反序列化 Firebase 中的子类

我正在使用新的firebase sdk for android,并使用真正的数据库功能。当我使用时,一切都很好。但是当我想解析一个子类时,母类的所有属性都是,并且我有这种类型的错误:getValue(simple.class)null

在 class uk.edume.edumeapp.TestChild 上找不到名称的 setter/字段

public class TestChild  extends TestMother {

    private String childAttribute;

    public String getChildAttribute() {
        return childAttribute;
    }
}

public class TestMother {

    protected String motherAttribute;

    protected String getMotherAttribute() {
        return motherAttribute;
    }
}

此功能

snapshot.getValue(TestChild.class);

motherAttribute属性是 ,我得到null

在 class uk.edume.edumeapp.TestChild 上找不到 motherAttribute 的 setter/field

我解析的 Json 是:

{
  "childAttribute" : "attribute in child class",
  "motherAttribute" : "attribute in mother class"
}

答案 1

Firebaser here

这是某些版本的 Firebase Database SDK for Android 中的一个已知错误:我们的序列化程序/反序列化程序仅考虑已声明类的属性/字段。

从基类继承的属性的序列化在适用于 Android 的 Firebase 数据库 SDK 的 9.0 到 9.6 (iirc) 版本中缺失。从那时起,它被添加回版本中。

解决方法

同时,您可以使用Jackson(Firebase 2.x SDK在引擎盖下使用)来使继承模型正常工作。

更新:这是一个关于如何从JSON读取到您的:TestChild

public class TestParent {
    protected String parentAttribute;

    public String getParentAttribute() {
        return parentAttribute;
    }
}
public class TestChild  extends TestParent {
    private String childAttribute;

    public String getChildAttribute() {
        return childAttribute;
    }
}

你会注意到我公开了,因为只考虑公共字段/getters。通过此更改,此 JSON:getParentAttribute()

{
  "childAttribute" : "child",
  "parentAttribute" : "parent"
}

通过以下方式变得可读:

ObjectMapper mapper = new ObjectMapper();
GenericTypeIndicator<Map<String,Object>> indicator = new GenericTypeIndicator<Map<String, Object>>() {};
TestChild value = mapper.convertValue(dataSnapshot.getValue(indicator), TestChild.class);

这有点奇怪,但幸运的是,这是一个可以复制/粘贴的神奇咒语。GenericTypeIndicator


答案 2

这显然最终在9.6版中得到了修复。

修复了将派生类传递到 DatabaseReference#setValue() 时未正确保存超类中的属性的问题。


推荐