You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的资源插件规则和配置上,按以下步骤修复:

  1. 为IsAlive类添加@Serializable注解
    新版Ktor的Resources插件要求所有标注@Resource的类必须实现序列化,即使类本身无属性。修改后的资源类:

    @Resource("/")
    @Serializable
    class IsAlive()
    
  2. 检查项目序列化插件配置
    确保项目构建脚本中正确引入序列化插件和依赖:

    • 插件声明(以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版本")
          }
      }
      
  3. 确认HTTP客户端的插件安装
    在httpClient的实际实现中,确保同时安装Resources和ContentNegotiation插件:

    actual fun httpClient(config: HttpClientConfig<*>.() -> Unit) = HttpClient(CIO) {
        install(Resources)
        install(ContentNegotiation) {
            Json()
        }
        config()
    }
    

原因:新版Ktor的类型安全资源机制会将资源类用于请求路径的生成与解析,即使无属性,也需要序列化支持来完成这一流程。文档可能未同步更新这一规则,导致你按旧文档操作出现异常。

内容的提问来源于stack exchange,提问作者musako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:52:40