具有抽象 class 集合的 Kotlin Kmongo 库
Kotlin Kmongo library with abstract class collection
我有这些模型
abstract class Message : Data
data class TextMessage(val m: String): Message
data class ImageMessage(val m: ByteArray): Message
我想通过摘要class消息
获得一个集合
database.getCollection<Message>
但它实际上是一个工具 class (TextMessage, ImageMessage) 实例,具体取决于它的内容
when(val value = collection.findOne()) {
is TextMessage -> {}
is ImageMessage -> {}
}
怎么做?
KMongo 库有 3 个对象映射选项,您的解决方案将取决于所使用的选项。
By default, Jackson engine is used. You can use POJO Codec engine by adding a -native suffix to the artifactId, or Kotlinx Serialization by adding a -serialization suffix to the artifactId.
https://litote.org/kmongo/quick-start/#object-mapping-engine
根据使用的引擎,应用该引擎处理多态性的方式:
杰克逊
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
abstract class Message
更多信息:https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
本地人
@BsonDiscriminator
abstract class Message
不确定是否有更多关于此的信息,但这里有官方文档:https://mongodb.github.io/mongo-java-driver/4.3/bson/pojos/#annotations
这实际上将 class 名称存储在 _t
字段下,并在反序列化期间使用
kotlinx 序列化
@Serializable
sealed class Message
@Serializable
data class TextMessage(val m: String) : Message()
@Serializable
data class ImageMessage(val m: ByteArray) : Message()
与杰克逊一样,您可能还需要考虑其他方式和事项:https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md
我有这些模型
abstract class Message : Data
data class TextMessage(val m: String): Message
data class ImageMessage(val m: ByteArray): Message
我想通过摘要class消息
获得一个集合database.getCollection<Message>
但它实际上是一个工具 class (TextMessage, ImageMessage) 实例,具体取决于它的内容
when(val value = collection.findOne()) {
is TextMessage -> {}
is ImageMessage -> {}
}
怎么做?
KMongo 库有 3 个对象映射选项,您的解决方案将取决于所使用的选项。
By default, Jackson engine is used. You can use POJO Codec engine by adding a -native suffix to the artifactId, or Kotlinx Serialization by adding a -serialization suffix to the artifactId.
https://litote.org/kmongo/quick-start/#object-mapping-engine
根据使用的引擎,应用该引擎处理多态性的方式:
杰克逊
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) abstract class Message
更多信息:https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
本地人
@BsonDiscriminator abstract class Message
不确定是否有更多关于此的信息,但这里有官方文档:https://mongodb.github.io/mongo-java-driver/4.3/bson/pojos/#annotations
这实际上将 class 名称存储在
_t
字段下,并在反序列化期间使用kotlinx 序列化
@Serializable sealed class Message @Serializable data class TextMessage(val m: String) : Message() @Serializable data class ImageMessage(val m: ByteArray) : Message()
与杰克逊一样,您可能还需要考虑其他方式和事项:https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md