mirror of
https://github.com/mamoe/mirai.git
synced 2025-04-25 21:23:55 +08:00
[Review] Extract MessageSerializersImpl to separate file
This commit is contained in:
parent
9e631111d4
commit
41a34bdf65
mirai-core-api/src/commonMain/kotlin/message
mirai-core/src
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2019-2021 Mamoe Technologies and contributors.
|
||||
*
|
||||
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
|
||||
*
|
||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
package net.mamoe.mirai.message
|
||||
|
||||
import kotlinx.serialization.ContextualSerializer
|
||||
import kotlinx.serialization.KSerializer
|
||||
import kotlinx.serialization.modules.*
|
||||
import net.mamoe.mirai.message.data.Message
|
||||
import net.mamoe.mirai.message.data.MessageChain
|
||||
import net.mamoe.mirai.message.data.SingleMessage
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalApi
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
* 消息序列化器.
|
||||
*
|
||||
* @see SingleMessage.Serializer
|
||||
* @see MessageChain.Serializer
|
||||
*
|
||||
* @see MessageSerializers.INSTANCE
|
||||
*/
|
||||
public interface MessageSerializers {
|
||||
/**
|
||||
* 包含 [SingleMessage] 多态序列化和 [Message] [ContextualSerializer] 信息的 [SerializersModule].
|
||||
*
|
||||
* 在序列化消息时都需要
|
||||
*/
|
||||
public val serializersModule: SerializersModule
|
||||
|
||||
/**
|
||||
* 注册一个 [SerializersModuleBuilder.contextual] 和 [SingleMessage] 多态域的 [PolymorphicModuleBuilder.subclass]
|
||||
*
|
||||
* 相当于
|
||||
* ```
|
||||
* contextual(baseClass, serializer)
|
||||
* polymorphic(SingleMessage::class) {
|
||||
* subclass(baseClass, serializer)
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
@MiraiExperimentalApi
|
||||
public fun <M : SingleMessage> registerSerializer(baseClass: KClass<M>, serializer: KSerializer<M>)
|
||||
|
||||
/**
|
||||
* 合并 [serializersModule] 到 [MessageSerializers.serializersModule] 并覆盖.
|
||||
*/
|
||||
@MiraiExperimentalApi
|
||||
public fun registerSerializers(serializersModule: SerializersModule)
|
||||
|
||||
public companion object INSTANCE : MessageSerializers by MessageSerializersImpl
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* Copyright 2019-2021 Mamoe Technologies and contributors.
|
||||
* Copyright 2020 Mamoe Technologies and contributors.
|
||||
*
|
||||
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
|
||||
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
|
||||
*
|
||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
package net.mamoe.mirai.message
|
||||
@ -15,25 +15,16 @@ import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.descriptors.*
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
import kotlinx.serialization.modules.*
|
||||
import kotlinx.serialization.modules.PolymorphicModuleBuilder
|
||||
import kotlinx.serialization.modules.SerializersModule
|
||||
import kotlinx.serialization.modules.overwriteWith
|
||||
import kotlinx.serialization.modules.polymorphic
|
||||
import net.mamoe.mirai.Mirai
|
||||
import net.mamoe.mirai.message.data.*
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalApi
|
||||
import net.mamoe.mirai.message.data.MessageChainImpl
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
@MiraiExperimentalApi
|
||||
public interface MessageSerializer {
|
||||
public val serializersModule: SerializersModule
|
||||
|
||||
public fun <M : SingleMessage> registerSerializer(baseClass: KClass<M>, serializer: KSerializer<M>)
|
||||
|
||||
public fun registerSerializers(serializersModule: SerializersModule)
|
||||
|
||||
public fun clearRegisteredSerializers()
|
||||
|
||||
public companion object INSTANCE : MessageSerializer by MessageSerializerImpl
|
||||
}
|
||||
|
||||
internal fun ClassSerialDescriptorBuilder.takeElementsFrom(descriptor: SerialDescriptor) {
|
||||
with(descriptor) {
|
||||
@ -174,7 +165,7 @@ private val builtInSerializersModule by lazy {
|
||||
}
|
||||
}
|
||||
|
||||
internal object MessageSerializerImpl : MessageSerializer {
|
||||
internal object MessageSerializersImpl : MessageSerializers {
|
||||
@Volatile
|
||||
private var serializersModuleField: SerializersModule? = null
|
||||
override val serializersModule: SerializersModule get() = serializersModuleField ?: builtInSerializersModule
|
||||
@ -193,11 +184,6 @@ internal object MessageSerializerImpl : MessageSerializer {
|
||||
override fun registerSerializers(serializersModule: SerializersModule) {
|
||||
serializersModuleField = serializersModule.overwriteWith(serializersModule)
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
override fun clearRegisteredSerializers() {
|
||||
serializersModuleField = builtInSerializersModule
|
||||
}
|
||||
}
|
||||
|
||||
internal inline fun <T, R> KSerializer<T>.map(
|
@ -17,7 +17,7 @@ import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.protobuf.ProtoBuf
|
||||
import kotlinx.serialization.protobuf.ProtoNumber
|
||||
import net.mamoe.mirai.message.MessageSerializer
|
||||
import net.mamoe.mirai.message.MessageSerializers
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalApi
|
||||
import net.mamoe.mirai.utils.MiraiInternalApi
|
||||
import java.util.concurrent.ConcurrentLinkedQueue
|
||||
@ -31,12 +31,12 @@ import java.util.concurrent.ConcurrentLinkedQueue
|
||||
* 目前在回复时无法通过 [MessageSource.originalMessage] 获取自定义类型消息
|
||||
*
|
||||
* ## 序列化
|
||||
* 若要支持序列化, 需 [MessageSerializer.registerSerializer]
|
||||
* 若要支持序列化, 需 [MessageSerializers.registerSerializer]
|
||||
*
|
||||
* @sample samples.CustomMessageIdentifier 实现示例
|
||||
*
|
||||
* @see CustomMessageMetadata 自定义消息元数据
|
||||
* @see MessageSerializer
|
||||
* @see MessageSerializers
|
||||
*/
|
||||
@Serializable
|
||||
@MiraiExperimentalApi
|
||||
|
@ -20,7 +20,7 @@ import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
import kotlinx.serialization.json.Json
|
||||
import net.mamoe.mirai.event.events.MessageEvent
|
||||
import net.mamoe.mirai.message.MessageSerializer
|
||||
import net.mamoe.mirai.message.MessageSerializers
|
||||
import net.mamoe.mirai.message.code.CodableMessage
|
||||
import net.mamoe.mirai.message.data.MessageSource.Key.quote
|
||||
import net.mamoe.mirai.message.data.MessageSource.Key.recall
|
||||
@ -110,13 +110,13 @@ public interface MessageChain : Message, List<SingleMessage>, RandomAccess, Coda
|
||||
public companion object {
|
||||
private fun getDefaultJson() = Json {
|
||||
serializersModule =
|
||||
MessageSerializer.serializersModule // don't convert to property, serializersModule is volatile.
|
||||
MessageSerializers.serializersModule // don't convert to property, serializersModule is volatile.
|
||||
ignoreUnknownKeys = true
|
||||
}
|
||||
|
||||
/**
|
||||
* 从 JSON 字符串解析 [MessageChain]
|
||||
* @param json 需要包含 [MessageSerializer.serializersModule]
|
||||
* @param json 需要包含 [MessageSerializers.serializersModule]
|
||||
* @see serializeToJsonString
|
||||
*/
|
||||
@JvmOverloads
|
||||
|
@ -34,7 +34,7 @@ import net.mamoe.mirai.internal.network.protocol.packet.list.FriendList
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.toByteArray
|
||||
import net.mamoe.mirai.message.MessageReceipt
|
||||
import net.mamoe.mirai.message.MessageSerializer
|
||||
import net.mamoe.mirai.message.MessageSerializers
|
||||
import net.mamoe.mirai.message.action.Nudge
|
||||
import net.mamoe.mirai.message.data.*
|
||||
import net.mamoe.mirai.message.data.Image.Key.IMAGE_ID_REGEX
|
||||
@ -51,52 +51,52 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
|
||||
companion object INSTANCE : MiraiImpl() {
|
||||
@Suppress("ObjectPropertyName", "unused", "DEPRECATION_ERROR")
|
||||
private val _init = Mirai.let {
|
||||
MessageSerializer.registerSerializer(OfflineGroupImage::class, OfflineGroupImage.serializer())
|
||||
MessageSerializer.registerSerializer(OfflineFriendImage::class, OfflineFriendImage.serializer())
|
||||
MessageSerializer.registerSerializer(OnlineFriendImageImpl::class, OnlineFriendImageImpl.serializer())
|
||||
MessageSerializer.registerSerializer(OnlineGroupImageImpl::class, OnlineGroupImageImpl.serializer())
|
||||
MessageSerializers.registerSerializer(OfflineGroupImage::class, OfflineGroupImage.serializer())
|
||||
MessageSerializers.registerSerializer(OfflineFriendImage::class, OfflineFriendImage.serializer())
|
||||
MessageSerializers.registerSerializer(OnlineFriendImageImpl::class, OnlineFriendImageImpl.serializer())
|
||||
MessageSerializers.registerSerializer(OnlineGroupImageImpl::class, OnlineGroupImageImpl.serializer())
|
||||
|
||||
MessageSerializer.registerSerializer(MarketFaceImpl::class, MarketFaceImpl.serializer())
|
||||
MessageSerializers.registerSerializer(MarketFaceImpl::class, MarketFaceImpl.serializer())
|
||||
|
||||
// MessageSource
|
||||
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceFromGroupImpl::class,
|
||||
OnlineMessageSourceFromGroupImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceFromFriendImpl::class,
|
||||
OnlineMessageSourceFromFriendImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceFromTempImpl::class,
|
||||
OnlineMessageSourceFromTempImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceFromStrangerImpl::class,
|
||||
OnlineMessageSourceFromStrangerImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceToGroupImpl::class,
|
||||
OnlineMessageSourceToGroupImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceToFriendImpl::class,
|
||||
OnlineMessageSourceToFriendImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceToTempImpl::class,
|
||||
OnlineMessageSourceToTempImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OnlineMessageSourceToStrangerImpl::class,
|
||||
OnlineMessageSourceToStrangerImpl.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OfflineMessageSourceImplData::class,
|
||||
OfflineMessageSourceImplData.serializer()
|
||||
)
|
||||
MessageSerializer.registerSerializer(
|
||||
MessageSerializers.registerSerializer(
|
||||
OfflineMessageSourceImplData::class,
|
||||
OfflineMessageSourceImplData.serializer()
|
||||
)
|
||||
|
@ -15,7 +15,7 @@ import kotlinx.serialization.serializer
|
||||
import net.mamoe.mirai.Mirai
|
||||
import net.mamoe.mirai.internal.message.MarketFaceImpl
|
||||
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
|
||||
import net.mamoe.mirai.message.MessageSerializer
|
||||
import net.mamoe.mirai.message.MessageSerializers
|
||||
import net.mamoe.mirai.message.data.*
|
||||
import org.junit.jupiter.api.BeforeAll
|
||||
import org.junit.jupiter.api.Test
|
||||
@ -24,7 +24,7 @@ import kotlin.test.assertEquals
|
||||
internal class MessageSerializationTest {
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
private val module
|
||||
get() = MessageSerializer.serializersModule
|
||||
get() = MessageSerializers.serializersModule
|
||||
private val format
|
||||
get() = Json {
|
||||
serializersModule = module
|
||||
|
Loading…
Reference in New Issue
Block a user