Skip to content

Ktor Client 中的 WebSockets 序列化

类似于 ContentNegotiation 插件,WebSockets 允许您以特定格式序列化/反序列化文本帧。Ktor 客户端开箱即用支持以下格式:JSON、XML、CBOR 和 ProtoBuf。

添加依赖项

在开始使用 kotlinx.serialization 转换器之前,您需要按照 设置 部分所述添加 Kotlin 序列化插件。

JSON

要序列化/反序列化 JSON 数据,您可以从以下库中任选其一:kotlinx.serialization、Gson 或 Jackson。

在构建脚本中添加 ktor-serialization-kotlinx-json 工件:

Kotlin
Groovy
XML

在构建脚本中添加 ktor-serialization-gson 工件:

Kotlin
Groovy
XML

在构建脚本中添加 ktor-serialization-jackson 工件:

Kotlin
Groovy
XML

XML

要序列化/反序列化 XML,请在构建脚本中添加 ktor-serialization-kotlinx-xml

Kotlin
Groovy
XML

请注意,XML 序列化 jsNode 目标平台上不受支持

CBOR

要序列化/反序列化 CBOR,请在构建脚本中添加 ktor-serialization-kotlinx-cbor

Kotlin
Groovy
XML

ProtoBuf

要序列化/反序列化 ProtoBuf,请在构建脚本中添加 ktor-serialization-kotlinx-protobuf

Kotlin
Groovy
XML

配置序列化器

JSON 序列化器

要在 WebSockets 配置 中注册 JSON 序列化器,请创建一个带有 Json 参数的 KotlinxWebsocketSerializationConverter 实例,并将该实例分配给 contentConverter 属性:

kotlin
import io.ktor.serialization.kotlinx.*
import kotlinx.serialization.json.*

val client = HttpClient(CIO) {
    install(WebSockets) {
        contentConverter = KotlinxWebsocketSerializationConverter(Json)
    }
}

要注册 Gson 序列化器,请将 GsonWebsocketContentConverter 分配给 contentConverter 属性:

kotlin
import io.ktor.serialization.gson.*

install(WebSockets) {
    contentConverter = GsonWebsocketContentConverter()
}

要注册 Jackson 序列化器,请将 JacksonWebsocketContentConverter 分配给 contentConverter 属性:

kotlin
import io.ktor.serialization.jackson.*

install(WebSockets) {
    contentConverter = JacksonWebsocketContentConverter()
}

XML 序列化器

要在 WebSockets 配置 中注册 XML 序列化器,请创建一个带有 XML 参数的 KotlinxWebsocketSerializationConverter 实例,并将该实例分配给 contentConverter 属性:

kotlin
import nl.adaptivity.xmlutil.serialization.*

install(WebSockets) {
    contentConverter = KotlinxWebsocketSerializationConverter(XML)
}

CBOR 序列化器

要在 WebSockets 配置 中注册 CBOR 序列化器,请创建一个带有 Cbor 参数的 KotlinxWebsocketSerializationConverter 实例,并将该实例分配给 contentConverter 属性:

kotlin
import io.ktor.serialization.kotlinx.cbor.*

install(WebSockets) {
    contentConverter = KotlinxWebsocketSerializationConverter(Cbor)
}

ProtoBuf 序列化器

要在 WebSockets 配置 中注册 ProtoBuf 序列化器,请创建一个带有 ProtoBuf 参数的 KotlinxWebsocketSerializationConverter 实例,并将该实例分配给 contentConverter 属性:

kotlin
import io.ktor.serialization.kotlinx.protobuf.*

install(WebSockets) {
    contentConverter = KotlinxWebsocketSerializationConverter(ProtoBuf)
}

接收和发送数据

创建数据类

要将文本帧序列化/反序列化为对象或从对象转换,您需要创建一个数据类,例如:

kotlin
data class Customer(val id: Int, val firstName: String, val lastName: String)

如果您使用 kotlinx.serialization,请确保该类带有 @Serializable 注解:

kotlin
@Serializable
data class Customer(val id: Int, val firstName: String, val lastName: String)

要了解有关 kotlinx.serialization 的更多信息,请参阅 Kotlin 序列化指南

发送数据

要在指定的 格式 下通过文本帧发送 类实例,请使用 sendSerialized 函数:

kotlin
client.webSocket(method = HttpMethod.Get, host = "127.0.0.1", port = 8080, path = "/customer") {
    sendSerialized(Customer(1, "Jane", "Smith"))
}

接收数据

要接收并转换文本帧的内容,请调用 receiveDeserialized 函数,该函数接受一个数据类作为参数:

kotlin
client.webSocket(method = HttpMethod.Get, host = "127.0.0.1", port = 8080, path = "/customer/1") {
    val customer = receiveDeserialized<Customer>()
    println("A customer with id ${customer.id} is received by the client.")
}

要从 incoming 通道接收反序列化帧,请使用 WebsocketContentConverter.deserialize 函数。WebsocketContentConverter 可通过 DefaultClientWebSocketSession.converter 属性获取。

您可以在此处找到完整示例:client-websockets-serialization