我的android应用程序在启动时崩溃,因为后端的小错误(位于Firebase中)。我的Firestore数据库中的文档有一个字段,其中应包含Image对象(ID和URL),但由于某种原因,它在数据库中存储的时间很长。
我收到此错误:
java.lang.RuntimeException: Could not deserialize object. Can't convert object of type java.lang.Long to type com..data.entity.gps.tracker.ImageEntity
我的ImageEntity类:
public class ImageEntity {
private int id;
private String image_id;
public String getImage_id() {
return image_id;
}
public void setImage_id(String image_id) {
this.image_id = image_id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
我不能仅仅排除Cover ImageEntity对象,它是我应用程序的组成部分,如何添加验证步骤以检查Cover对象是否是有效对象而不是长对象?
这是崩溃发生的地方:
public List<Model> mapList(QuerySnapshot querySnapshot) {
List<Model> list = new ArrayList<>();
for (QueryDocumentSnapshot queryDocumentSnapshot : querySnapshot) {
Model model = map(queryDocumentSnapshot);
long id = ((Release) model).getId();
if (!addedReleasesIDs.contains(id)) {
list.add(model);
addedReleasesIDs.add(id);
}
}
return list;
}
public Model map(QueryDocumentSnapshot queryDocumentSnapshot) {
// Auto serialization
Entity entity = queryDocumentSnapshot.toObject(getEntityClass()); // CRASH HERE
return map(entity);
}
答案 0 :(得分:1)
如果您需要控制文档快照的反序列化,则应使用getData()以Map<String, Object>
的形式访问其字段,而不是使用Firebase SDK内部映射器。
Map<String, Object> data = (Map<String, Object>) queryDocumentSnapshot.getData();
现在,您可以按名称get()
从data
映射中<partial name="_AlarmListPartial" />
,检查其类型,并将其转换为模型对象所需的其他任何类型。
在性能方面也比使用toObject更快,因为它不必使用Java反射。