Сериализация карты с Ktor и kotlinx.serialization - PullRequest
1 голос
/ 29 апреля 2020

Вот маршрут Ktor, который возвращает карту LocalDates:

route {
   get {
       val map = mapOf(LocalDate.now() to "test")
       call.respond(map)
   }
}

LocalDate не сериализуем, однако:

kotlinx.serialization.SerializationException: Can't locate argument-less serializer for class LocalDate. For generic classes, such as lists, please provide serializer explicitly.

Я создал свой собственный сериализатор:

@Serializer(forClass = LocalDate::class)
object LocalDateSerializer : KSerializer<LocalDate> {
    override fun serialize(encoder: Encoder, value: LocalDate) {
        encoder.encodeString(value.toString())
    }

    override fun deserialize(decoder: Decoder): LocalDate {
        return LocalDate.parse(decoder.decodeString())
    }
}

Я могу использовать этот сериализатор в классе данных, например, data class Foo(@Serializable(with=LocalDateSerializer::class)date: LocalDate. Но я не знаю, как заставить это работать с моей картой.

Я попробовал несколько разных аннотаций:

val map: Map<@ContextualSerialization LocalDate, String> = mapOf(LocalDate.now() to "test")
// OR
val map: Map<@Serializable(with=LocalDateSerializer::class) LocalDate, String> = mapOf(LocalDate.now() to "test")

И я попытался зарегистрировать это с Ktor:

install(ContentNegotiation) {
    json(module = serializersModuleOf(LocalDate::class, LocalDateSerializer))
}

Независимо от того, что я пытаюсь, я получаю тот же SerializationException, что и выше.

Как я могу автоматически применить мой сериализатор, когда kotlinx.serialization пытается проанализировать LocalDate? ИЛИ как я могу предложить сериализатор, когда Ktor пытается сериализовать мою карту?

...