Jonathan Hollingsworth
08/23/2021, 7:07 PMkotlinx.serializable
On the way out (i.e. serializing) it works fine with this
@Serializable
data class Task(
var id: Int? = null, val title: String, val detail: String? = null,
@Contextual
val dueDate: LocalDate? = null
)
But when I try to
val task = call.receive<Task>()
in route, then I get an Serializer for class 'LocalDate' is not found.
I've been through the kotlinx.serialization docs, but I can't see find anything to help.bsimmons
08/23/2021, 7:37 PMAleksei Tirman [JB]
08/24/2021, 8:15 AMLocalDate
from JDK or kotlinx-datetime?Jonathan Hollingsworth
08/24/2021, 8:46 AMDid you remember to setup the serializer context?Remember? Not really. I did read that, and didn't understand it. I've read it again, and still don't tbh.
Jonathan Hollingsworth
08/24/2021, 8:47 AMIsIt's added viafrom JDK or kotlinx-datetime?LocalDate
import java.time.LocalDate
Aleksei Tirman [JB]
08/24/2021, 9:10 AMLocalDate
and using context serialization bind them together at runtime. Here is a working example:
import io.ktor.application.*
import io.ktor.features.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.serialization.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import kotlinx.serialization.Contextual
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import java.time.LocalDate
import java.time.format.DateTimeFormatter
object LocalDateSerializer : KSerializer<LocalDate> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: LocalDate) {
val result = value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
encoder.encodeString(result)
}
override fun deserialize(decoder: Decoder): LocalDate {
return LocalDate.parse(decoder.decodeString())
}
}
fun main(args: Array<String>) {
embeddedServer(Netty, port = 5050) {
install(ContentNegotiation) {
json(Json {
serializersModule = SerializersModule {
contextual(LocalDate::class, LocalDateSerializer)
}
})
}
routing {
post("/") {
val t = call.receive<Task>()
call.respondText { t.dueDate!!.format(DateTimeFormatter.ISO_DATE) }
}
}
}.start()
}
@Serializable
data class Task(
var id: Int? = null,
@Contextual
val dueDate: LocalDate? = null
)
Jonathan Hollingsworth
08/24/2021, 9:12 AMJonathan Hollingsworth
08/24/2021, 9:13 AMJonathan Hollingsworth
08/24/2021, 9:17 AM