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()).
Есть ли способ получить сериализацию типов перечислений? Или некоторые из них должны быть явными в отношении метода сериализатора?
Ответы
Ответ 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