Android Firebase Firestore无法反序列化抽象类

时间:2019-01-16 20:45:23

标签: android firebase inheritance google-cloud-firestore

我正在迁移现有的应用程序以使用Firebase Firestore。我遇到一个问题,其中一个模型包含一个继承抽象类的对象的列表:

// Model
class Project {
    ...
    ArrayList<PaintItem> paintItems;
    ...
}

abstract class PaintItem {
    ...
}

class CeilingPaintItem extends PaintItem {
    ...
}

class WindowPaintItem extends PaintItem {
    ...
}

存储Project对象可以很好地工作,但是在检索它时:

project = documents.toObject(Project.class)

它引发异常,试图实例化抽象类(PaintItem)。我怀疑发生这种情况是因为在后台,序列化无法检查每个PaintItem实际是什么类。

克服此问题的最佳方法是什么?最好的意思是:

  • 最有效
  • 在需要更改PaintItem上的数据字段并继承类的情况下可维护

1 个答案:

答案 0 :(得分:1)

首先,最有效的解决方案是根本不使用自动对象映射。它使用Java反射,速度不是很快。在运行时自行管理地图和列表要快得多。除了使用更少的字段之外,您无法采取其他措施来提高基于反射的序列化的性能。

第二,您已经发现,您不能让接口或抽象类参与对象映射序列化。 Firebase SDK完全不了解您最初用于序列化的任何对象类型。它只是查看每个对象(或公共字段)的getter和setter以确定如何将对象属性映射到字段中,反之亦然。如果要使用自动对象映射,则必须使用no-arg构造函数指定一个具体的类。如果PaintItem总是抽象的,那么至少,您需要在Project中使用PaintItem的具体子类来使SDK能够反序列化对象。