使用Ktor类型安全请求时遇SerializationException问题求助
问题
按照Ktor官方文档实现类型安全请求时,调用Client类的isAlive函数触发了SerializationException。
资源类代码
package com.example.client.client_routes import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.* import io.ktor.client.plugins.resources.* import io.ktor.client.request.* import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.resources.* import kotlinx.coroutines.* import kotlinx.serialization.* @Resource("/") class IsAlive()
IsAlive类仅添加@Resource("/")注解,未标记@Serializable,但调用时触发序列化异常。
Client类代码
package com.example.client import com.example.client.client_routes.IsAlive import com.example.client.client_routes.User import com.example.client.model.CreateUser import com.example.client.model.Login import io.ktor.client.* import io.ktor.client.request.* import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.client.plugins.resources.* expect fun httpClient(config: HttpClientConfig<*>.() -> Unit = {}): HttpClient class Client { private val client = httpClient() public suspend fun isAlive(): String { val res = client.get(IsAlive()) return res.bodyAsText() } public suspend fun createUser(createUserRequest: CreateUser): HttpStatusCode { val res = client.post(User()) { setBody(createUserRequest) } return res.status } public suspend fun login(login: Login): HttpStatusCode { val res = client.post(com.example.client.client_routes.Login()) { setBody(login) } return res.status } }
错误信息
kotlinx.serialization.SerializationException: Serializer for class 'IsAlive' is not found. Please ensure that class is marked as '@Serializable' and that the serialization compiler plugin is applied.
当前使用Kotlin Multiplatform和最新版Ktor,IsAlive类无属性却被要求序列化,请问遗漏了什么?
解决方案
问题出在新版Ktor的资源插件规则和配置上,按以下步骤修复:
为
IsAlive类添加@Serializable注解
新版Ktor的Resources插件要求所有标注@Resource的类必须实现序列化,即使类本身无属性。修改后的资源类:@Resource("/") @Serializable class IsAlive()检查项目序列化插件配置
确保项目构建脚本中正确引入序列化插件和依赖:- 插件声明(以
build.gradle.kts为例):plugins { kotlin("multiplatform") version "你的Kotlin版本" kotlin("plugin.serialization") version "你的Kotlin版本" } - 公共依赖配置:
sourceSets { commonMain.dependencies { implementation("io.ktor:ktor-client-resources:你的Ktor版本") implementation("io.ktor:ktor-client-content-negotiation:你的Ktor版本") implementation("io.ktor:ktor-serialization-kotlinx-json:你的Ktor版本") } }
- 插件声明(以
确认HTTP客户端的插件安装
在httpClient的实际实现中,确保同时安装Resources和ContentNegotiation插件:actual fun httpClient(config: HttpClientConfig<*>.() -> Unit) = HttpClient(CIO) { install(Resources) install(ContentNegotiation) { Json() } config() }
原因:新版Ktor的类型安全资源机制会将资源类用于请求路径的生成与解析,即使无属性,也需要序列化支持来完成这一流程。文档可能未同步更新这一规则,导致你按旧文档操作出现异常。
内容的提问来源于stack exchange,提问作者musako
相关产品推荐
相关产品推荐

