我正在迁移现有的应用程序以使用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
上的数据字段并继承类的情况下可维护答案 0 :(得分:1)
首先,最有效的解决方案是根本不使用自动对象映射。它使用Java反射,速度不是很快。在运行时自行管理地图和列表要快得多。除了使用更少的字段之外,您无法采取其他措施来提高基于反射的序列化的性能。
第二,您已经发现,您不能让接口或抽象类参与对象映射序列化。 Firebase SDK完全不了解您最初用于序列化的任何对象类型。它只是查看每个对象(或公共字段)的getter和setter以确定如何将对象属性映射到字段中,反之亦然。如果要使用自动对象映射,则必须使用no-arg构造函数指定一个具体的类。如果PaintItem总是抽象的,那么至少,您需要在Project中使用PaintItem的具体子类来使SDK能够反序列化对象。