Skip to content

Ktor ClientにおけるWebSocketsシリアライゼーション

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

依存関係を追加する

kotlinx.serializationコンバーターを使用する前に、Setupセクションで説明されているように、Kotlinシリアライゼーションプラグインを追加する必要があります。

JSON

JSONデータをシリアライズ/デシリアライズするには、以下のいずれかのライブラリを選択できます: kotlinx.serialization、Gson、またはJackson。

ビルドスクリプトに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