Ktor 伺服器中的 WebSockets 序列化
與 ContentNegotiation 插件類似,WebSockets 允許您以特定格式序列化/反序列化文字訊框。Ktor 開箱即用支援以下格式:JSON、XML、CBOR 和 ProtoBuf。
新增依賴項
在使用 kotlinx.serialization 轉換器之前,您需要新增 Kotlin 序列化插件,如 設定 部分所述。
JSON
若要序列化/反序列化 JSON 資料,您可以選擇以下其中一個函式庫:kotlinx.serialization、Gson 或 Jackson。
在建置腳本中新增 ktor-serialization-kotlinx-json
Artifact:
在建置腳本中新增 ktor-serialization-gson
Artifact:
在建置腳本中新增 ktor-serialization-jackson
Artifact:
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("A customer with id ${customer.id} is received by the server.")
}
若要從 傳入 頻道接收反序列化訊框,請使用 WebsocketContentConverter.deserialize 函式。WebsocketContentConverter
可透過 WebSocketServerSession.converter
屬性取得。
傳送資料
若要在文字訊框中傳遞資料物件,並使用 指定格式,您可以使用 sendSerialized
函式:
webSocket("/customer/1") {
sendSerialized(Customer(1, "Jane", "Smith"))
}
您可以在此處找到完整範例:server-websockets-serialization。