首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有抽象类集合的Kotlin Kmongo库

带有抽象类集合的Kotlin Kmongo库
EN

Stack Overflow用户
提问于 2021-09-04 17:00:44
回答 1查看 356关注 0票数 0

我有这些模型

代码语言:javascript
复制
abstract class Message : Data
data class TextMessage(val m: String): Message
data class ImageMessage(val m: ByteArray): Message

我想通过抽象类消息获得一个集合。

代码语言:javascript
复制
database.getCollection<Message>

但是它实际上是一个实现类(TextMessage,ImageMessage)实例,具体取决于它的内容

代码语言:javascript
复制
when(val value = collection.findOne()) {
    is TextMessage -> {}
    is ImageMessage -> {}
}

怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-05 02:25:49

KMongo库有3个对象映射选项,您的解决方案将取决于使用哪个选项。

默认情况下,

使用杰克逊引擎。您可以通过向-native添加artifactId后缀来使用POJO引擎,也可以通过向artifactId添加-serialization后缀来使用Kotlinx。

https://litote.org/kmongo/quick-start/#object-mapping-engine

根据使用的引擎,应用该引擎如何处理多态性:

  • Jackson

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)抽象类消息

更多信息:https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

  • 本地人

@Bson判别器抽象类消息

不确定是否有更多关于这方面的信息,但这里的官方文档是:https://mongodb.github.io/mongo-java-driver/4.3/bson/pojos/#annotations

这实际上是将类名存储在一个deserialization字段下,并在_t期间使用

  • kotlinx序列化

@可序列化的密封类消息@序列化数据类TextMessage(val m: String):Message() @Serializable数据类ImageMessage(val : ByteArray):Message()

就像杰克逊一样,在这里你可能需要考虑其他的方法和事情:https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69057365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档