我有这些模型
abstract class Message : Data
data class TextMessage(val m: String): Message
data class ImageMessage(val m: ByteArray): Message我想通过抽象类消息获得一个集合。
database.getCollection<Message>但是它实际上是一个实现类(TextMessage,ImageMessage)实例,具体取决于它的内容
when(val value = collection.findOne()) {
is TextMessage -> {}
is ImageMessage -> {}
}怎么做?
发布于 2021-09-05 02:25:49
KMongo库有3个对象映射选项,您的解决方案将取决于使用哪个选项。
默认情况下,
使用杰克逊引擎。您可以通过向-native添加artifactId后缀来使用POJO引擎,也可以通过向artifactId添加-serialization后缀来使用Kotlinx。
https://litote.org/kmongo/quick-start/#object-mapping-engine
根据使用的引擎,应用该引擎如何处理多态性:
@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期间使用
@可序列化的密封类消息@序列化数据类TextMessage(val m: String):Message() @Serializable数据类ImageMessage(val : ByteArray):Message()
就像杰克逊一样,在这里你可能需要考虑其他的方法和事情:https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md
https://stackoverflow.com/questions/69057365
复制相似问题