由于缺少反射,从 KClass 获取序列化程序在本机上不可用
Obtaining serializer from KClass is not available on native due to the lack of reflection
描述
我在 iOS 和 Android 的多平台库中使用 Kotlinx 序列化库来处理 HTTP 请求。但是当我在 iOS 上使用我的请求函数时收到此消息,有解决方法吗?我函数中的哪一行调用了未实现的函数?
kotlin.NotImplementedError: 操作未实现:由于缺少反射,从 KClass 获取序列化程序在本机上不可用。直接在可序列化 class.
上使用 .serializer()
重现
这是我写的函数
@ImplicitReflectionSerializer
private suspend fun authenticationRequest(email: String, password: String): Either<ErrorMessage, Authentication> {
return try {
val response: Authentication = client.post {
url("${Constants.API_URL}/security/login")
body = jsonSerializer.write(LoginType(email, password))
}
Either.Right(response)
} catch (e: ResponseException) {
val message = Json.parse<ErrorMessage>(e.response.content.readUTF8Line() ?: "").apply {
codeHttp = e.response.status.value
reason = e.response.status.description
}
Either.Left(message)
}
}
环境
科特林版本:1.3.31
Kotlinx序列化版本:0.11.0
Kotlin 平台:iOS 和 Android
Gradle版本:5.1.1
我自己解决了这个问题。为了让它工作,我必须在初始化 KotlinxSerializer 时使用 setMapper
val serialiser = KotlinxSerializer(Json.nonstrict).apply {
setMapper(Foo::class, Foo.serializer())
}
当我调用Json.parse()时,这个函数的另一个签名很有用
Json.parse(ErrorMessage.serializer(), e.response.content.readUTF8Line() ?: "")
描述
我在 iOS 和 Android 的多平台库中使用 Kotlinx 序列化库来处理 HTTP 请求。但是当我在 iOS 上使用我的请求函数时收到此消息,有解决方法吗?我函数中的哪一行调用了未实现的函数?
kotlin.NotImplementedError: 操作未实现:由于缺少反射,从 KClass 获取序列化程序在本机上不可用。直接在可序列化 class.
上使用 .serializer()重现
这是我写的函数
@ImplicitReflectionSerializer
private suspend fun authenticationRequest(email: String, password: String): Either<ErrorMessage, Authentication> {
return try {
val response: Authentication = client.post {
url("${Constants.API_URL}/security/login")
body = jsonSerializer.write(LoginType(email, password))
}
Either.Right(response)
} catch (e: ResponseException) {
val message = Json.parse<ErrorMessage>(e.response.content.readUTF8Line() ?: "").apply {
codeHttp = e.response.status.value
reason = e.response.status.description
}
Either.Left(message)
}
}
环境
科特林版本:1.3.31
Kotlinx序列化版本:0.11.0
Kotlin 平台:iOS 和 Android
Gradle版本:5.1.1
我自己解决了这个问题。为了让它工作,我必须在初始化 KotlinxSerializer 时使用 setMapper
val serialiser = KotlinxSerializer(Json.nonstrict).apply {
setMapper(Foo::class, Foo.serializer())
}
当我调用Json.parse()时,这个函数的另一个签名很有用
Json.parse(ErrorMessage.serializer(), e.response.content.readUTF8Line() ?: "")