KtorサーバーでのWebSocketシリアライゼーション
ContentNegotiationプラグインと同様に、WebSocketでは、特定の形式でテキストフレームをシリアライズ/デシリアライズできます。Ktorは以下のフォーマットを標準でサポートしています。JSON、XML、CBOR、ProtoBuf。
依存関係の追加
kotlinx.serializationコンバーターを使用する前に、セットアップセクションに記載されている通り、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シリアライザー
WebSocketの設定で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シリアライザー
WebSocketの設定でXMLシリアライザーを登録するには、XML
パラメーターを指定してKotlinxWebsocketSerializationConverter
インスタンスを作成し、このインスタンスをcontentConverter
プロパティに割り当てます。
import nl.adaptivity.xmlutil.serialization.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(XML)
}
CBORシリアライザー
WebSocketの設定でCBORシリアライザーを登録するには、Cbor
パラメーターを指定してKotlinxWebsocketSerializationConverter
インスタンスを作成し、このインスタンスをcontentConverter
プロパティに割り当てます。
import io.ktor.serialization.kotlinx.cbor.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Cbor)
}
ProtoBufシリアライザー
WebSocketの設定で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.")
}
incomingチャネルからデシリアライズされたフレームを受信するには、WebsocketContentConverter.deserialize関数を使用します。WebsocketContentConverter
はWebSocketServerSession.converter
プロパティを通じて利用可能です。
データの送信
指定されたフォーマットを使用してデータオブジェクトをテキストフレームで渡すには、sendSerialized
関数を使用できます。
webSocket("/customer/1") {
sendSerialized(Customer(1, "Jane", "Smith"))
}
完全な例はこちらで確認できます: server-websockets-serialization。