【发布时间】:2019-08-31 07:09:06
【问题描述】:
我有一个 Firestore 集合,其中包含没有公共键或值的不同数据对象。 在 Kotlin 中,这表示为类似
sealed class Task()
data class WorkTask(val id: String): Task()
data class ReductionTask(val time: Date): Task()
我想以如下方式反序列化 Firestore 集合中的数据:
val tasks = result.toObjects(Task::class.java)
val workTasks = result.filterInstance(WorkTask::class.java)
val reductionTasks= result.filterInstance(ReductionTask::class.java)
总之,我想从 Firestore WorkTask | ReductionTask | OtherTask 检索一个联合,我可以将它保存在一个列表中,然后按实例进行过滤或模式匹配。
编辑:
目前,我的解决方法是使用 1 个通用键 (type) 来保存对象的类型:
inline fun <reifed T: Any> QuerySnapshot.deserializeByType(
crossinline selector: (type:String) -> Class<out T>
): List<T> {
return this.documents.map({ document ->
val type = firestoreDoc.getString("type")
document.toObject(selector(type))
})
}
querySnapshot.deserializeByType<Task> { type ->
when (type) {
"WORK" -> WorkTask::class.java
"REDUCE" -> ReductionTask::class.java
...
}
}
理论上,我可以只提供一个类列表并让它尝试/捕获来反序列化。但这似乎很糟糕。
【问题讨论】:
标签: kotlin google-cloud-firestore