为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2019-08-28 13:59:46
如何使用getValue(Subclass.class)反序列化Firebase中的子类我正在使用新的firebase sdk for android并使用真正的数据库功能。当我使用getValue(simple.class)一切都很好。但是,当我想解析一个子类的类时,母类的所有属性都是null,并且我有这种类型的错误:在类uk.edume.edumeapp.TestChild上找不到名称的setter / fieldpublic 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,我得到在类uk.edume.edumeapp.TestChild上找不到motherAttribute的setter / field我解析的Json是:{   "childAttribute" : "attribute in child class",   "motherAttribute" : "attribute in mother class"}
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

Firebaser在这里

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

Firebase Database SDK for Android版本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;
    }}

你会注意到我getParentAttribute()公开了,因为只考虑公共领域/吸气者。有了这个改变,这个JSON:

{
  "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有点奇怪,但幸运的是它是一个可以复制/粘贴的神奇咒语。


查看完整回答
反对 回复 2019-08-28
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2019-08-28
?
萧十郎

TA贡献1815条经验 获得超13个赞

对于:

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

为TestChild类设置setter:

 public class  TestMother {

     private String motherAttribute;

     public String getMotherAttribute() {
         return motherAttribute;
     }

     //set
     public void setMotherAttribute(String motherAttribute) {
         this.motherAttribute= motherAttribute;
     }
 }


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 509 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信