Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.13.0-M1 版本,需要序列化的类中带有 MessageSourceKind 时,编译报错, SERIALIZER_NOT_FOUND #2230

Closed
cssxsh opened this issue Sep 4, 2022 · 8 comments
Labels
C 优先级: 最高 t:bug 类型: bug
Milestone

Comments

@cssxsh
Copy link
Contributor

cssxsh commented Sep 4, 2022

问题描述

MessageSourceKind 无法直接在 kotlinx.serialization 下使用,会报警告 [SERIALIZER_NOT_FOUND]

复现

package com.example

import kotlinx.serialization.Serializable
import net.mamoe.mirai.message.data.MessageSourceKind

@Serializable
data class TestData(
    val kind: MessageSourceKind
)
plugins {
    kotlin("jvm") version "1.7.10"
    kotlin("plugin.serialization") version "1.7.10"

    id("net.mamoe.mirai-console") version "2.13.0-M1"
}

group = "com.example"
version = "0.1.0"

repositories {
    mavenLocal()
    mavenCentral()
}

mirai-core 版本

2.13.0-M1

bot-protocol

ANDROID_PHONE

其他组件版本

No response

系统日志

java.lang.AssertionError: Class with incorrect id found: expected net/mamoe/mirai/message/data/MessageSourceKind.$serializer, actual net/mamoe/mirai/message/data/MessageSourceKind.serializer
	at org.jetbrains.kotlin.load.kotlin.JavaClassDataFinder.findClassData(JavaClassDataFinder.kt:29)
	at org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer.createClass(ClassDeserializer.kt:44)
	at org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer.access$createClass(ClassDeserializer.kt:27)
	at org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer$classes$1.invoke(ClassDeserializer.kt:29)
	at org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer$classes$1.invoke(ClassDeserializer.kt:29)
	at org.jetbrains.kotlin.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578)
	at org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer.deserializeClass(ClassDeserializer.kt:34)
	at org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer.deserializeClass$default(ClassDeserializer.kt:33)
	at org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents.deserializeClass(context.kt:62)
	at org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberScope.deserializeClass(DeserializedMemberScope.kt:144)
	at org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberScope.computeDescriptors(DeserializedMemberScope.kt:120)
	at org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope$allDescriptors$1.invoke(DeserializedClassDescriptor.kt:301)
	at org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope$allDescriptors$1.invoke(DeserializedClassDescriptor.kt:300)
	at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
	at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
	at org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.getContributedDescriptors(DeserializedClassDescriptor.kt:311)
	at org.jetbrains.kotlin.resolve.scopes.MemberScopeKt.getDescriptorsFiltered(MemberScope.kt:84)
	at org.jetbrains.kotlin.resolve.scopes.MemberScopeKt.getDescriptorsFiltered$default(MemberScope.kt:79)
	at org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializationUtilKt.getClassSerializer(KSerializationUtil.kt:213)
	at org.jetbrains.kotlinx.serialization.compiler.backend.common.TypeUtilKt.findTypeSerializer(TypeUtil.kt:159)
	at org.jetbrains.kotlinx.serialization.compiler.backend.common.TypeUtilKt.findTypeSerializerOrContextUnchecked(TypeUtil.kt:132)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.checkType(SerializationPluginDeclarationChecker.kt:346)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.analyzePropertiesSerializers(SerializationPluginDeclarationChecker.kt:298)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.check(SerializationPluginDeclarationChecker.kt:55)
	at org.jetbrains.kotlin.resolve.ModifiersChecker$ModifiersCheckingProcedure.runDeclarationCheckers(ModifiersChecker.java:285)
	at org.jetbrains.kotlin.resolve.ModifiersChecker$ModifiersCheckingProcedure.checkModifierListCommon(ModifiersChecker.java:224)
	at org.jetbrains.kotlin.resolve.ModifiersChecker$ModifiersCheckingProcedure.checkModifiersForDeclaration(ModifiersChecker.java:183)
	at org.jetbrains.kotlin.resolve.DeclarationsChecker.process(DeclarationsChecker.kt:95)
	at org.jetbrains.kotlin.resolve.BodyResolver.resolveBodies(BodyResolver.java:258)
	at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer.analyzeDeclarations(LazyTopDownAnalyzer.kt:227)
	at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer.analyzeDeclarations$default(LazyTopDownAnalyzer.kt:58)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:130)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:99)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:264)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:55)
	at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:115)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:255)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:101)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:60)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:157)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:52)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:94)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:43)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:477)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:127)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:366)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally$default(IncrementalCompilerRunner.kt:311)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.rebuild(IncrementalCompilerRunner.kt:110)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:200)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:75)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:625)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:101)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1739)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
	at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:833)

网络日志

No response

补充信息

No response

@Him188 Him188 added t:bug 类型: bug M 优先级: 主要 labels Sep 4, 2022
@Him188 Him188 added this to the 2.13.0-RC milestone Sep 4, 2022
@Him188
Copy link
Member

Him188 commented Sep 4, 2022

看起来是 serialization 的编译器插件问题 (即 Kotlin 问题)

@Him188
Copy link
Member

Him188 commented Sep 4, 2022

试了一下按上面的代码可以复现.

@Serializable
enum class MyEnum {
    VALUE1
}

fun main() {
    val serializer = MessageSourceKind.Companion.serializer()
    println(serializer)
    println(MyEnum.serializer())
}

运行结果:

net.mamoe.mirai.message.data.MessageSourceKind$$serializer@66d2e7d9
com.example.MyEnum$$serializer@7c0e2abd

可能 kotlinx-serialization 在序列化或反序列化 KotlinMetadata 时出了什么问题

@Him188
Copy link
Member

Him188 commented Sep 4, 2022

@Him188
Copy link
Member

Him188 commented Sep 4, 2022

测试: net.mamoe.mirai.message.data.MessageOriginKindnet.mamoe.mirai.message.data.PlainText 都一样有问题

@Him188 Him188 added C 优先级: 最高 and removed M 优先级: 主要 labels Sep 4, 2022
@Him188
Copy link
Member

Him188 commented Sep 12, 2022

测试:

  • mirai-core.jvmTest
fun main() {
    println(MessageOriginKind.serializer()) // net.mamoe.mirai.message.data.MessageOriginKind$$serializer@39c0f4a
    println(Json.encodeToString(MessageOriginKind.serializer(), MessageOriginKind.MUSIC_SHARE)) // "MUSIC_SHARE"
}

编译正常, 运行正常

  • 一个 Kotlin/JVM 项目, 使用 Kotlin 1.7.10, 在 class 定义中使用 MessageSourceKind
@Serializable
data class TestData(
    val kind: MessageSourceKind
//            ^^^^^^^^^^^^^^^^^ [SERIALIZER_NOT_FOUND] Serializer has not been found for type 'MessageSourceKind'. To use context serializer as fallback, explicitly annotate type or property with @Contextual
)

编译失败:

java.lang.AssertionError: Class with incorrect id found: expected net/mamoe/mirai/message/data/MessageSourceKind.$serializer, actual net/mamoe/mirai/message/data/MessageSourceKind.serializer
  • 一个 Kotlin/JVM 项目, 使用 Kotlin 1.7.10, 不在 class 定义中使用 MessageSourceKind, 而通过 Companion 访问其 serializer:

编译运行成功, 输出正常

@Serializable
enum class MyEnum {
    VALUE1
}

fun main() {
    val serializer = MessageSourceKind.Companion.serializer()
    println(serializer) // net.mamoe.mirai.message.data.MessageSourceKind$$serializer@66d2e7d9
    println(MyEnum.serializer()) // com.example.MyEnum$$serializer@7c0e2abd
}

@Him188
Copy link
Member

Him188 commented Sep 12, 2022

是 relocate 导致的

@Karlatemp
Copy link
Member

@Him188
Copy link
Member

Him188 commented Sep 13, 2022

image
作为最快临时解决方案

@Him188 Him188 closed this as completed in 00db1fe Sep 20, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C 优先级: 最高 t:bug 类型: bug
Projects
None yet
Development

No branches or pull requests

3 participants