169 похожих чатов

Такой вопрос возник. Можно ли как-то нормально зарегистрировать generic class

в serializersModule (kx.serialization 1.3.2)? Если да, то как?

Ошибка:
Serializer for Response can't be registered as a subclass for polymorphic serialization because its kind SEALED is not concrete. To work with multiple hierarchies, register it as a base class.

Иерархия:
sealed interface Response<T>
@Serializable class SuccessfulResponse<T>(val data: T) : Response<T>
@Serializable class ErrorResponse<T>(val description: String) : Response<T>

Регистрация:
SerializersModule {
polymorphic(Response::class) {
subclass(ResponseSerializer(PolymorphicSerializer(Any::class)))
}
}

ResponseSerializer: https://nekobin.com/namudinuri.kt

Ошибка возникает при попытке десериализовать Response<List<Update>>, где Update — предварительно зарегистрированный десериализуемый класс

В то же время, я могу спокойно десериализовать объект Update:
polymorphic(Update::class) {
default { UpdateSerializer }
}

sealed interface Update
@Serializable class MessageUpdate(message: Message) : Update

Я думаю, что проблема именно в дженерике, потому что Response<Boolean> тоже не хочет
Я ещё пробовал через contextual и builder, но он жаловался, что список пустой.

contextual(Response::class) { ResponseSerializer(it[0]) }

Попробовал зарегистрировать List как подкласс Any:

Star projections in type arguments are not allowed, but had kotlin.collections.List<*>

polymorphic(Any::class) {
subclass(Boolean::class)
subclass(List::class)
}

6 ответов

7 просмотров

Можно сделать через суррогат и десериализовывать суррогат, превращая его в нужный тип

Evgen-Fil // hehe Автор вопроса
Алексей Овсянников
Можно

Не понял, как это может мне помочь

Evgen-Fil // hehe Автор вопроса

Короче решил эту проблему явной десериализацией json. Просто беру строку, которая мне приходит, и явно десериализую с указанием класса. val responseString = client.post { ... }.bodyAsText() return when (val response = json.decodeFromString(ResponseSerializer(serializer<T>()), responseString)) { is SuccessfulResponse -> response.result as T is ErrorResponse -> error("API call $method failed: ${response.description}") }

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
Подскажите, есть какие-то события создания/уничтожения у TFrame по типу TForm (OnCreate и OnClose/OnDestroy) ? Как отловить создание TFrame и "перед" уничтожением. На Tframe р...
Денис
8
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
а чем хуже?
Alexey Kulakov
10
Карта сайта