【问题标题】:Android firebase 9.0.0 setValue to serialize enumsAndroid firebase 9.0.0 setValue 序列化枚举
【发布时间】:2016-05-19 23:35:05
【问题描述】:

我有这个类使用枚举。解析到 Firebase json 过去工作得很好 - 使用 Jackson。 在迁移到 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;
    }
}

我怀疑 Firebase 在序列化 setValue(new MyClass()) 时不再使用 Jackson。

有没有办法让枚举类型序列化?或者一些关于序列化方法的显式方法?

【问题讨论】:

  • 我会重新考虑接受一个显然不是长期解决方案的答案。虽然不必再导入 Jackson 很好,但我们已经放弃了对我们许多人不需要的闪亮新功能的代码的控制。在 Firebase 允许我们通过他们的 SDK 配置 JSON 序列化程序之前,我认为目前没有可接受的解决方案。

标签: android firebase firebase-realtime-database


【解决方案1】:

您是对的,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);
        }
    }
}

【讨论】:

  • 谢谢,有帮助!我刚刚添加了空检查。并且为了 Kind.valueOf 的完整性,还应该验证 IllegalArgumentException。但是这里的操作意图可能会有所不同。
  • 添加了空检查,谢谢!如果这对您有用,您能否将答案标记为已接受?
  • 感谢您的回答,有谁知道为什么杰克逊的序列化已被删除?这很方便......
  • @MarcoHC 部分担忧是当数据库仅使用 Jackson 的一小部分时依赖项的大小。新的实施对您来说有什么遗漏吗?
  • @hatboysam 原来的问题仍然存在,Firebase 没有将枚举转换为字符串(就像之前的行为那样)丢失了。这不能修吗?具有讽刺意味的是,世界顶级软件公司之一是如何推荐这样一个 hacky 解决方案的。不是每个人都可以修改他们的 POJO。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2011-05-07
    • 2019-05-31
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多