Привет всем, я не могу придумать лучшего примера, чтобы проиллюстрировать мою точку зрения, поэтому дайте мне знать, если в моем примере есть ошибки. Но, надеюсь, этот пример разъяснит мою точку зрения.
class A {
String CATEGORY = "A";
public String getCATEGORY() {
return CATEGORY;
}
}
class B extends A {
String CATEGORY = "B";
@Override
public String getCATEGORY() {
return CATEGORY;
}
}
class C extends A {
String CATEGORY = "C";
@Override
public String getCATEGORY() {
return CATEGORY;
}
}
public class MyClass {
private List<A> array = Arrays.asList(new A(), new B(), new C());
public MyClass() {}
}
Теперь, если я загружу MyClass в firebase, например, с помощью setValue, firebase покажет мне свойства классов A, B и C. Однако, когда я читаю данные из firebase и вызываю sth, например getValue (MyClass.class), List он возвращает мне все относятся к типу A, и подклассы не сохраняются. Есть ли обходной путь, позволяющий firebase сохранять загруженные типы классов?
Если вы используете сериализатор Firebase по умолчанию, он просто записывает все общедоступные свойства и поля в базу данных. Скажем, вы храните по одному экземпляру каждого класса, это будет:
-L1234567890: {
cATEGORY: "A"
},
-L1234567891: {
cATEGORY: "B"
},
-L1234567892: {
cATEGORY: "C"
},
В базе данных недостаточно знаний для SDK, чтобы заново создать правильный подкласс. Хотя мы с вами видим, что значение cATEGORY соответствует имени класса, Firebase SDK не имеет таких сведений.
Однако нетрудно написать свой собственный десериализатор для этих данных, взяв DataSnapshot с указанными выше значениями и повторно установив правильный класс и значения.
Вы также можете сделать гибрид: определить тип класса напрямую, а затем указать Firebase, какой класс читать:
String cat = snapshot.child("cATEGORY").getValue(String.class)
Class clazz = "C".equals(cat) ? C.class : "B".equals(cat) ? B.class : A.clas;
A object = snapshot.getValue(clazz);