0

使用 ktor 客户端,我有一个从可序列化对象派生的不可序列化对象,如下所示:

@Serializable
@SerialName("login-request")
open class LoginRequest (
    open val email : String = "",
    open val password : String = ""
) : ServiceRequestPayload

实现类

class LoginRequestVo : LoginRequest("", ""), NodeComponent by NodeComponentImpl() {
    override val email: String by subject("")
    override val password: String by subject("")
}

现在,当我像这样手动使用 kotlinx 序列化时:

val request : LoginRequest = LoginRequestVo().apply {
    email = "test@gmail.com"
    password = "password"
}

val str = Json.encodeToString(request)
println(str)

它正确地对其进行序列化,并且在另一侧反序列化时,它正确地反序列化为 LoginRequest。但是,当我使用 ktor-client 序列化我的对象时,它抱怨 LoginRequestVo 不可序列化。下面的示例代码使用了我项目中的一些其他对象,并且包含您需要的更多信息,但要点是U调用函数中的类型,因此request.payload表达式是下面LoginRequest指定的类型LoginServiceImpl

suspend inline fun <T, U: ServiceRequestPayload> HttpClient.invoke(desc : EndpointDescriptor<T, U>, request : ServiceRequest<U>? ) : ServiceResponse {
    val path = "/api${desc.path}"
    return when(desc.method) {
        HttpMethod.GET -> {
            get(path)
        }
        HttpMethod.POST -> {
            if (request == null) {
                post(path)
            } else {
                post(path) {
                    contentType(ContentType.Application.Json)
                    body = request.payload
                }
            }
        }
        HttpMethod.DELETE -> delete(desc.path)
        HttpMethod.PUT -> {
            if (request == null) {
                put(path)
            } else {
                post(path) {
                    contentType(ContentType.Application.Json)
                    body = request.payload
                }
            }
        }
    }
}

class LoginServiceImpl(
    context : ApplicationContext
) : LoginService {
    private val client by context.service<HttpClient>()

    override suspend fun login(request: ServiceRequest<LoginRequest>) = client.invoke(LoginServiceDesc.login, request)
    override suspend fun register(request: ServiceRequest<LoginRequest>) = client.invoke(LoginServiceDesc.register, request)
}

我得到的错误是: 在此处输入图像描述

我的问题是,有没有办法为 ktor-client 指定在需要序列化主体时使用的类型或序列化程序?

4

0 回答 0