serializersModule
序列化本对象数据时使用的 SerializersModule. 用于支持多态序列化等. 在序列化时会先使用 PluginData.serializersModule, 再对无法找到 serializer 的类型使用 MessageSerializers.serializersModule.
使用示例
假设你编写了一个类型 ChatHistory
用来存储一个群的消息记录:
data class ChatHistory(
val groupId: Long,
val chain: List<MessageChain>,
)
Content copied to clipboard
要在 PluginData 中支持它, 需要首先为 ChatHistory
编写 KSerializer.
一种方式是为其添加 kotlinx.serialization.Serializable:
@Serializable
data class ChatHistory(
val groupId: Long,
val chain: List<MessageChain>,
)
Content copied to clipboard
编译器将会自动生成一个 KSerializer, 可通过 ChatHistory.Companion.serializer()
获取.
然后在 PluginData 定义中添加该 KSerializer:
object MyData : AutoSavePluginData("save") {
// 注意, serializersModule 需要早于其他属性定义初始化
override val serializersModule = SerializersModule {
contextual(ChatHistory::class, ChatHistory.serializers()) // 为 ChatHistory 指定 KSerializer
}
val histories: Map<Long, ChatHistory> by value()
}
Content copied to clipboard
然而, 即使不覆盖 serializersModule
提供 KSerializer, mirai 也会通过反射尝试获取.
但对于不是使用 @Serializable
注解方式, 或者是 interface
, abstract class
等的抽象类型, 则必须覆盖 serializersModule
并提供其 KSerializer.
Since
2.11
See also
SerializersModule