Веб-сайты Ktor: kotlinx.сериализация.Исключение SerializationException: Сериализатор для класса «DefaultClientWebSocketSession» не найден

#kotlin #ktor #ktor-client

Вопрос:

сегодня я был на пути к созданию приложения в режиме реального времени и хотел использовать веб-сайты для обновления своих состояний.

Все работало хорошо, пока я не получил это Исключение:

 kotlinx.serialization.SerializationException: Serializer for class 'DefaultClientWebSocketSession' is not found.
Mark the class as @Serializable or provide the serializer explicitly.
 

Я искал и искал, но ничего не нашел.

Так что мой код выглядит аналогично этому:

Импорт Gradle:

 implementation("io.ktor:ktor-client-core:1.6.2")
implementation("io.ktor:ktor-client-cio:1.6.2")
implementation("io.ktor:ktor-client-serialization:1.6.2")
implementation("io.ktor:ktor-client-websockets:1.6.2")
 

Код:

 suspend fun main() {
    val endpoint = Url("http://localhost:8080")
    val client = HttpClient(CIO) {
        install(JsonFeature) {
            serializer = KotlinxSerializer()
        }
        install(WebSockets)
    }
    client.webSocket({
        url {
            takeFrom(endpoint)
            path("beeam")
        }
    }) {
        //Do something
    }
}
 

Я надеюсь, что там есть кто-то, кто может мне помочь.

Комментарии:

1. Не могли бы вы, пожалуйста, попытаться заменить http протокол ws на URL конечной точки? Кроме того, пожалуйста, поделитесь настройками сервера.

2. Спасибо, что помогли! Проблема заключалась в схеме. Но текст экзекуции на самом деле не имел никакого отношения к схеме.

Ответ №1:

Проблема

Проблема в том, что endpoint.protocol есть URLProtocol.HTTP и нет URLProtocol.WS , и с takeFrom вами тоже передают эту собственность.

Решение

 suspend fun main() {
    val endpoint = Url("http://localhost:8080")
    val client = HttpClient(CIO) {
        install(JsonFeature) {
            serializer = KotlinxSerializer()
        }
        install(WebSockets)
    }
    client.webSocket({
        url {
            takeFrom(endpoint)
            path("beeam")
            protocol = URLProtocol.WS
        }
    }) {
        //Do something
    }
}