Deprecate SingleMessage.Serializer for compatibility issue with array polymorphism

This commit is contained in:
Him188 2021-02-05 22:33:36 +08:00
parent 9febb66922
commit 5cd617eaa6
3 changed files with 17 additions and 6 deletions

View File

@ -11,6 +11,7 @@ package net.mamoe.mirai.message
import kotlinx.serialization.ContextualSerializer
import kotlinx.serialization.KSerializer
import kotlinx.serialization.PolymorphicSerializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.PolymorphicModuleBuilder
import kotlinx.serialization.modules.SerializersModule
@ -26,14 +27,13 @@ import kotlin.reflect.KClass
/**
* 消息序列化器.
*
* [MessageSerializers] 存放 [SerializersModule], 用于协助 [SingleMessage.Serializer] 的多态序列化.
* [MessageSerializers] 存放 [SerializersModule], 用于协助 [SingleMessage] [PolymorphicSerializer] 的多态序列化.
*
* 要序列化一个 [MessageChain], 请使用内建的 [MessageChain.serializeToJsonString]
*
* @see serializersModule
*
*
* @see SingleMessage.Serializer
* @see MessageChain.Serializer
*
* @see MessageSerializers.INSTANCE

View File

@ -245,7 +245,7 @@ public interface MessageChain :
*/
public object Serializer : KSerializer<MessageChain> {
@Suppress("DEPRECATION_ERROR")
private val delegate = ListSerializer(SingleMessage.Serializer)
private val delegate = ListSerializer(PolymorphicSerializer(SingleMessage::class))
override val descriptor: SerialDescriptor = delegate.descriptor
override fun deserialize(decoder: Decoder): MessageChain = delegate.deserialize(decoder).toMessageChain()
override fun serialize(encoder: Encoder, value: MessageChain): Unit = delegate.serialize(encoder, value)

View File

@ -19,19 +19,30 @@ package net.mamoe.mirai.message.data
import kotlinx.serialization.KSerializer
import kotlinx.serialization.PolymorphicSerializer
import kotlinx.serialization.Serializable
import net.mamoe.mirai.utils.safeCast
/**
* 单个消息元素. 与之相对的是 [MessageChain], 是多个 [SingleMessage] 的集合.
*/
@Serializable(SingleMessage.Serializer::class)
// @Serializable(SingleMessage.Serializer::class)
public interface SingleMessage : Message { // TODO: 2021/1/10 Make sealed interface in Kotlin 1.5
/**
* @suppress deprecated since 2.4.0
*/
@Deprecated(
"Please create PolymorphicSerializer(SingleMessage::class) on your own.",
ReplaceWith(
"PolymorphicSerializer(SingleMessage::class)",
"kotlinx.serialization.PolymorphicSerializer",
"net.mamoe.mirai.message.data.SingleMessage",
),
level = DeprecationLevel.WARNING
)
public object Serializer : KSerializer<SingleMessage> by PolymorphicSerializer(SingleMessage::class)
}
/**
* 消息元数据, 即不含内容的元素.
*