1
0
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:
Him188 2021-01-06 15:55:26 +08:00
parent 9e631111d4
commit 41a34bdf65
6 changed files with 92 additions and 48 deletions
mirai-core-api/src/commonMain/kotlin/message
mirai-core/src
commonMain/kotlin
jvmTest/kotlin/message/data

View File

@ -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
}

View File

@ -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(

View File

@ -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

View File

@ -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

View File

@ -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()
)

View File

@ -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