Вот маршрут 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 пытается сериализовать мою карту?