Получение сериализатора от KClass недоступно на нативном из-за отсутствия рефлексии - PullRequest
1 голос
/ 07 июня 2019

Описание

Я использую библиотеку сериализации Kotlinx в многоплатформенной библиотеке для iOS и Android для обработки HTTP-запросов.Но у меня есть это сообщение, когда я использую функцию запроса на iOS, есть ли обходной путь?Какая строка в моей функции вызывает невыполненную функцию?

kotlin.NotImplementedError: Операция не реализована: получение сериализатора из KClass недоступно в native из-за отсутствия отражения.Используйте .serializer () непосредственно для сериализуемого класса.

Для воспроизведения

Это функция, которую я написал

@ImplicitReflectionSerializer
private suspend fun authenticationRequest(email: String, password: String): Either<ErrorMessage, Authentication> {
    return try {
        val response: Authentication = client.post {
            url("${Constants.API_URL}/security/login")
            body = jsonSerializer.write(LoginType(email, password))
        }
         Either.Right(response)
    } catch (e: ResponseException) {
        val message = Json.parse<ErrorMessage>(e.response.content.readUTF8Line() ?: "").apply {
            codeHttp = e.response.status.value
            reason = e.response.status.description
        }
        Either.Left(message)
    }
}

Среда

  • Версия Kotlin: 1.3.31

  • Версия сериализации Kotlinx: 0.11.0

  • Платформы Kotlin: iOS и Android

  • Версия Gradle: 5.1.1

1 Ответ

2 голосов
/ 11 июня 2019

Я решил проблему самостоятельно.Чтобы это работало, мне пришлось использовать setMapper при инициализации KotlinxSerializer

val serialiser = KotlinxSerializer(Json.nonstrict).apply {
        setMapper(Foo::class, Foo.serializer())
}

А когда я вызываю Json.parse (), другая сигнатура этой функции полезна

Json.parse(ErrorMessage.serializer(), e.response.content.readUTF8Line() ?: "")
...