в 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)
}
Можно сделать через суррогат и десериализовывать суррогат, превращая его в нужный тип
Не понял, как это может мне помочь
Извиняюсь, невнимательно прочитал
Короче решил эту проблему явной десериализацией 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}") }
Обсуждают сегодня