首页 > 解决方案 > Android Firebase 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实际上是什么类。

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

标签: androidfirebaseinheritancegoogle-cloud-firestore

解决方案


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

其次,正如您所发现的,您不能让接口或抽象类参与对象映射序列化。Firebase SDK 根本不知道您用于序列化的任何类型的对象。它只是查看每个对象(或公共字段)的 getter 和 setter,以确定如何将对象属性映射到字段,反之亦然。如果要使用自动对象映射,则必须指定具有无参数构造函数的具体类。如果 PaintItem 始终是抽象的,那么至少,您需要 Project 中 PaintItem 的具体子类,以便 SDK 能够反序列化对象。


推荐阅读