如何使用getValue(Subclass.class)在Firebase中反序列化子类 [英] How to deserialise a subclass in Firebase using getValue(Subclass.class)

查看:202
本文介绍了如何使用getValue(Subclass.class)在Firebase中反序列化子类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


没有在类uk.edume.edumeapp.TestChild上找到名字的setter / field



  public class TestChild extends TestMother {
$ b $ private String childAttribute;

public String getChildAttribute(){
return childAttribute;



public class TestMother {

protected String motherAttribute;

protected String getMotherAttribute(){
return motherAttribute;




$ b $ p $这个函数

  snapshot.getValue(TestChild.class); 

motherAttribute 属性是 null ,我得到


没有在类uk.edume.edumeapp上找到的motherAttribute的setter / field。 TestChild


我解析的Json是:

 < code $ {
childAttribute:child class中的属性,
motherAttribute:母类中的属性
}


解决方案

这里是Firebaser

这是Android版Firebase数据库SDK的一些版本中的一个已知错误:我们的序列化器/反序列化器只考虑已声明类的属性/字段。

从基类继承的属性的序列化在Firebase数据库SDK for Android的版本9.0到9.6(iirc)中丢失。从那以后,它被添加到版本中。

解决方法



在此期间,您可以使用Jackson(其中Firebase 2.x软件开发工具包),使继承模型的工作。



更新:这是一个如何可以从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;




$ b $ p
$ b $ p $你会注意到我把 getParentAttribute() public,因为只考虑public fields / getters。有了这个变化,这个JSON:

$ $ $ $ b $ child $ :parent
}

b

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

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

I'm using the new firebase sdk for android and use the real database feature. When i use the getValue(simple.class) everything is fine. But when i want to parse a class which is a subclass, all the attribute of the mother class are null, and i have this type of error:

No setter/field for name found on class uk.edume.edumeapp.TestChild

public class TestChild  extends TestMother {

    private String childAttribute;

    public String getChildAttribute() {
        return childAttribute;
    }
}

public class TestMother {

    protected String motherAttribute;

    protected String getMotherAttribute() {
        return motherAttribute;
    }
}

this function

snapshot.getValue(TestChild.class);

motherAttribute attribute is null, and I get

No setter/field for motherAttribute found on class uk.edume.edumeapp.TestChild

the Json that i parse is:

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

解决方案

Firebaser here

This is a known bug in some versions of the Firebase Database SDK for Android: our serializer/deserializer only considers properties/fields on the declared class.

Serialization of inherited properties from the base class, is missing in the in releases 9.0 to 9.6 (iirc) of the Firebase Database SDK for Android. It was added back in versions since then.

Workaround

In the meantime you can use Jackson (which the Firebase 2.x SDKs used under the hood) to make the inheritance model work.

Update: here's a snippet of how you can read from JSON into your 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;
    }
}

You'll note that I made getParentAttribute() public, because only public fields/getters are considered. With that change, this JSON:

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

Becomes readable with:

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

The GenericTypeIndicator is a bit weird, but luckily it's a magic incantation that can be copy/pasted.

这篇关于如何使用getValue(Subclass.class)在Firebase中反序列化子类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆