MessageSerializers.kt 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Copyright 2019-2022 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/dev/LICENSE
  8. */
  9. package net.mamoe.mirai.message
  10. import kotlinx.serialization.ContextualSerializer
  11. import kotlinx.serialization.KSerializer
  12. import kotlinx.serialization.PolymorphicSerializer
  13. import kotlinx.serialization.json.Json
  14. import kotlinx.serialization.modules.PolymorphicModuleBuilder
  15. import kotlinx.serialization.modules.SerializersModule
  16. import kotlinx.serialization.modules.subclass
  17. import net.mamoe.mirai.internal.message.MessageSerializersImpl
  18. import net.mamoe.mirai.message.data.Message
  19. import net.mamoe.mirai.message.data.MessageChain
  20. import net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString
  21. import net.mamoe.mirai.message.data.SingleMessage
  22. import net.mamoe.mirai.utils.MiraiExperimentalApi
  23. import net.mamoe.mirai.utils.NotStableForInheritance
  24. import kotlin.reflect.KClass
  25. /**
  26. * 消息序列化器.
  27. *
  28. * [MessageSerializers] 存放 [SerializersModule], 用于协助 [SingleMessage] [PolymorphicSerializer] 的多态序列化.
  29. *
  30. * 要序列化一个 [MessageChain], 请使用内建的 [MessageChain.serializeToJsonString]
  31. *
  32. * @see serializersModule
  33. *
  34. *
  35. * @see MessageChain.Serializer
  36. *
  37. * @see MessageSerializers.INSTANCE
  38. */
  39. @NotStableForInheritance
  40. public interface MessageSerializers {
  41. /**
  42. * 包含 [SingleMessage] 多态序列化和 [Message] [ContextualSerializer] 信息的 [SerializersModule].
  43. *
  44. * 在序列化消息时都需要提供给相关 [Json] 配置的 [Json.serializersModule]. 如通过:
  45. * ```
  46. * val json = Json {
  47. * serializesModule = MessageSerializers.serializersModule
  48. * }
  49. * ```
  50. */
  51. public val serializersModule: SerializersModule
  52. /**
  53. * 注册 [serializer] 到 [type] 的所有为 [SingleMessage] 子类型的超类型的多态域 [PolymorphicModuleBuilder.subclass]
  54. *
  55. * 实现:
  56. * ```
  57. * for (superclass in type.allSuperclasses) {
  58. * if (superclass.isFinal) continue
  59. * if (superclass.isSubclassOf(SingleMessage::class)) continue
  60. * polymorphic(superclass) {
  61. * subclass(type, serializer)
  62. * }
  63. * }
  64. * ```
  65. *
  66. *
  67. * 若要自己实现消息类型, 务必在这里注册对应序列化器, 否则在 [MessageChain.serializeToJsonString] 时将会出错.
  68. *
  69. * @since 2.0, revised 2.3
  70. */
  71. @MiraiExperimentalApi
  72. public fun <M : SingleMessage> registerSerializer(
  73. type: KClass<M>,
  74. serializer: KSerializer<M>
  75. ) // not supported on native.
  76. /**
  77. * 合并 [serializersModule] 到 [MessageSerializers.serializersModule] 并覆盖.
  78. */
  79. @MiraiExperimentalApi
  80. public fun registerSerializers(serializersModule: SerializersModule) // supported on all platforms.
  81. public companion object INSTANCE : MessageSerializers by MessageSerializersImpl
  82. }