Подтвердить что ты не робот

Android firebase 9.0.0 setValue для сериализации перечислений

У меня этот класс, используя перечисления. Разбор с Firebase json работал очень хорошо - используя Джексона. При миграции на базу данных firebase: 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 больше не использует Jackson при сериализации setValue (новый MyClass()).

Есть ли способ получить сериализацию типов перечислений? Или некоторые из них должны быть явными в отношении метода сериализатора?

4b9b3361

Ответ 1

Вы правы, Firebase Database больше не использует 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);
        }
    }
}

Ответ 2

Как побочный оптимизирующий ответ В Android рекомендуется не использовать Enums. Используйте @StringDef или @IntDef, чтобы он мог работать без обходных решений и оптимизировал ваше приложение для памяти.

Очень хорошее видео рассуждение, почему: https://www.youtube.com/watch?v=Hzs6OBcvNQE