使用 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 指定在需要序列化主体时使用的类型或序列化程序?