android - 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
实际上是什么类。
克服这个问题的最佳方法是什么?最好的意思是:
- 最有效率
- 如果我需要更改
PaintItem
和继承类上的数据字段,则可维护
解决方案
首先,最有效的解决方案是根本不使用自动对象映射。它使用 java 反射,速度不是很快。在运行时自行管理地图和列表要快得多。除了使用更少的字段之外,您无法提高基于反射的序列化的性能。
其次,正如您所发现的,您不能让接口或抽象类参与对象映射序列化。Firebase SDK 根本不知道您用于序列化的任何类型的对象。它只是查看每个对象(或公共字段)的 getter 和 setter,以确定如何将对象属性映射到字段,反之亦然。如果要使用自动对象映射,则必须指定具有无参数构造函数的具体类。如果 PaintItem 始终是抽象的,那么至少,您需要 Project 中 PaintItem 的具体子类,以便 SDK 能够反序列化对象。
推荐阅读
- javascript - 对数组的所有元素执行一个函数
- ssl - 升级到 nginx 3.11.1 时获得“最大重定向”
- python - 如何阻止我的 websocket 连接关闭?
- python - Discord.py 多禁令
- python - django manytomany 用户自动填充用户字段
- android - Android Fragment 在配置更改时保持侦听器
- javascript - 用 getElementsByClassName 替换 getElementById
- android - 使用英雄联盟 API 时改造 response.body 为空
- c# - FileLoadException:程序集仍在加载中
- c++ - 带有异步 boost::asio 的 socks4