Skip to content

Ktor Client における WebSockets のシリアライズ

ContentNegotiation プラグインと同様に、WebSockets ではテキストフレームを特定の形式でシリアライズ/デシリアライズできます。Ktor クライアントは、標準で JSON、XML、CBOR、ProtoBuf の各形式をサポートしています。

依存関係の追加

kotlinx.serialization コンバーターを使用する前に、Setup セクションの説明に従って Kotlin serialization プラグインを追加する必要があります。

JSON

JSON データをシリアライズ/デシリアライズするには、kotlinx.serializationGsonJackson のいずれかのライブラリを選択できます。

ビルドスクリプトに 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 シリアライザーを登録するには、GsonWebsocketContentConvertercontentConverter プロパティに割り当てます。

kotlin
import io.ktor.serialization.gson.*

install(WebSockets) {
    contentConverter = GsonWebsocketContentConverter()
}

Jackson シリアライザーを登録するには、JacksonWebsocketContentConvertercontentConverter プロパティに割り当てます。

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 Serialization Guide を参照してください。

データの送信

指定した形式のテキストフレーム内でクラスインスタンスを送信するには、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 関数を使用します。WebsocketContentConverterDefaultClientWebSocketSession.converter プロパティ経由で利用可能です。

完全な例はこちらで確認できます: client-websockets-serialization