Ktor 服务器中的 WebSockets 序列化
与 ContentNegotiation 插件类似,WebSockets 允许你以特定格式序列化/反序列化文本帧。Ktor 开箱即用地支持以下格式:JSON、XML、CBOR 和 ProtoBuf。
添加依赖项
在使用 kotlinx.serialization 转换器之前,你需要按照 Setup 部分的描述添加 Kotlin 序列化插件。
JSON
要序列化/反序列化 JSON 数据,你可以选择以下库之一:kotlinx.serialization、Gson 或 Jackson。
在构建脚本中添加 ktor-serialization-kotlinx-json 构件:
在构建脚本中添加 ktor-serialization-gson 构件:
在构建脚本中添加 ktor-serialization-jackson 构件:
XML
要序列化/反序列化 XML,请在构建脚本中添加 ktor-serialization-kotlinx-xml:
请注意,XML 序列化不支持
jsNode目标。
CBOR
要序列化/反序列化 CBOR,请在构建脚本中添加 ktor-serialization-kotlinx-cbor:
ProtoBuf
要序列化/反序列化 ProtoBuf,请在构建脚本中添加 ktor-serialization-kotlinx-protobuf:
配置序列化器
JSON 序列化器
要在 WebSockets 配置中注册 JSON 序列化器,请创建带有 Json 参数的 KotlinxWebsocketSerializationConverter 实例,并将此实例赋值给 contentConverter 属性:
import io.ktor.serialization.kotlinx.*
import kotlinx.serialization.json.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Json)
}要注册 Gson 序列化器,请将 GsonWebsocketContentConverter 赋值给 contentConverter 属性:
import io.ktor.serialization.gson.*
install(WebSockets) {
contentConverter = GsonWebsocketContentConverter()
}要注册 Jackson 序列化器,请将 JacksonWebsocketContentConverter 赋值给 contentConverter 属性:
import io.ktor.serialization.jackson.*
install(WebSockets) {
contentConverter = JacksonWebsocketContentConverter()
}XML 序列化器
要在 WebSockets 配置中注册 XML 序列化器,请创建带有 XML 参数的 KotlinxWebsocketSerializationConverter 实例,并将此实例赋值给 contentConverter 属性:
import nl.adaptivity.xmlutil.serialization.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(XML)
}CBOR 序列化器
要在 WebSockets 配置中注册 CBOR 序列化器,请创建带有 Cbor 参数的 KotlinxWebsocketSerializationConverter 实例,并将此实例赋值给 contentConverter 属性:
import io.ktor.serialization.kotlinx.cbor.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Cbor)
}ProtoBuf 序列化器
要在 WebSockets 配置中注册 ProtoBuf 序列化器,请创建带有 ProtoBuf 参数的 KotlinxWebsocketSerializationConverter 实例,并将此实例赋值给 contentConverter 属性:
import kotlinx.serialization.protobuf.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(ProtoBuf)
}接收和发送数据
创建数据类
要将帧序列化为对象或从对象反序列化帧,你需要创建一个数据类,例如:
data class Customer(val id: Int, val firstName: String, val lastName: String)如果你使用 kotlinx.serialization,请确保此数据类具有 @Serializable 注解:
@Serializable
data class Customer(val id: Int, val firstName: String, val lastName: String)接收数据
要接收并转换文本帧的内容,请调用接受数据类作为形参的 receiveDeserialized 函数:
webSocket("/customer") {
val customer = receiveDeserialized<Customer>()
println("服务器已接收到 ID 为 ${customer.id} 的客户。")
}要从 传入 通道接收反序列化帧,请使用 WebsocketContentConverter.deserialize 函数。WebsocketContentConverter 可通过 WebSocketServerSession.converter 属性获取。
发送数据
要使用 指定格式 在文本帧中传递数据对象,你可以使用 sendSerialized 函数:
webSocket("/customer/1") {
sendSerialized(Customer(1, "Jane", "Smith"))
}你可以在此处找到完整示例:server-websockets-serialization。
