Android firebase 9.0.0 setValue序列化枚举

rma*_*rau 14 android firebase firebase-realtime-database

我有这个课程使用枚举.解析Firebase json曾经工作得很好 - 使用杰克逊.迁移到firebase-database时:9.0.0我得到以下内容:

com.google.firebase.database.DatabaseException:没有在类上找到的序列化属性.... MyClass $ Kind

Kind是枚举声明的类型.班级:

public class MyClass {

    public enum Kind {W,V,U};

    private Double value;
    private Kind kind;

    /* Dummy Constructor */
    public MyClass() {}

    public Double getValue() {
        return value;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    public Kind getKind() {
        return kind;
    }

    public void setKind(Kind kind) {
        this.kind = kind;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑Firebase在序列化setValue(新的MyClass())时不再使用Jackson.

有没有办法让枚举类型序列化?或者某些方法是明确的序列化方法?

Sam*_*ern 17

你是对的,Firebase数据库不再使用Jackson进行序列化或反序列化.

通过这样做,您可以在与Firebase交谈时将您的枚举表示为字符串:

public class MyClass {

    public enum Kind {W,V,U};

    private Double value;
    private Kind kind;

    /* Dummy Constructor */
    public MyClass() {}

    public Double getValue() {
        return value;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    // The Firebase data mapper will ignore this
    @Exclude
    public Kind getKindVal() {
      return kind;
    }

    public String getKind() {
        // Convert enum to string
        if (kind == null) {
          return null;
        } else {
          return kind.name();
        }
    }

    public void setKind(String kindString) {
        // Get enum from string
        if (kindString == null) {
          this.kind = null;
        } else {
          this.kind = Kind.valueOf(kindString);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @hatboysam原始问题仍然存在,Firebase没有将枚举转换为字符串(如前面的行为所做的那样).这不能修复吗?具有讽刺意味的是,世界上一家顶级软件公司正在推荐像这样的hacky解决方案.不是每个人都可以修改他们的POJO. (2认同)

ase*_*ims 6

作为一个侧面的优化答案在Android中,建议不要使用Enums。使用@StringDef 或@IntDef,它可以在没有变通方法的情况下工作,并且您优化了应用程序的内存。

非常好的视频推理原因:https : //www.youtube.com/watch?v=Hzs6OBcvNQE