Ktor Client における WebSockets のシリアライズ
ContentNegotiation プラグインと同様に、WebSockets ではテキストフレームを特定の形式でシリアライズ/デシリアライズできます。Ktor クライアントは、標準で JSON、XML、CBOR、ProtoBuf の各形式をサポートしています。
依存関係の追加
kotlinx.serialization コンバーターを使用する前に、Setup セクションの説明に従って Kotlin serialization プラグインを追加する必要があります。
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.*
val client = HttpClient(CIO) {
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 io.ktor.serialization.kotlinx.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)kotlinx.serialization の詳細については、Kotlin Serialization Guide を参照してください。
データの送信
指定した形式のテキストフレーム内でクラスインスタンスを送信するには、sendSerialized 関数を使用します。
client.webSocket(method = HttpMethod.Get, host = "127.0.0.1", port = 8080, path = "/customer") {
sendSerialized(Customer(1, "Jane", "Smith"))
}データの受信
テキストフレームの内容を受信して変換するには、データクラスをパラメーターとして受け取る receiveDeserialized 関数を呼び出します。
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。
