Alex Spence
06/24/2019, 5:13 PMMarc Knaup
06/24/2019, 5:25 PM@Serializable
. Why do you need them to be of a specific type?
The library uses SerialModule
for registering additional serializers at runtime.Alex Spence
06/24/2019, 5:43 PMclass QueryRequestSerde: Serde<QueryRequest> {
override fun configure(configs: MutableMap<String, *>?, isKey: Boolean) {}
override fun deserializer(): Deserializer<T> = QueryRequestDeSerializer()
override fun close() {}
override fun serializer(): Serializer<QueryRequest> = QueryRequestSerializer()
}
class QueryRequestDeSerializer: Deserializer<QueryRequest> {
private val json = Json(JsonConfiguration.Stable)
override fun configure(configs: MutableMap<String, *>?, isKey: Boolean) {}
@ImplicitReflectionSerializer
override fun deserialize(topic: String?, data: ByteArray?): T? {
return if (data != null)
json.parse(QueryRequest.serializer(), data.toString(Charsets.UTF_8))
else null
}
override fun close() {}
}
class QueryRequestSerializer: Serializer<QueryRequest> {
override fun configure(configs: MutableMap<String, *>?, isKey: Boolean) {}
@ImplicitReflectionSerializer
override fun serialize(topic: String?, data: QueryRequest?): ByteArray? {
return if (data != null)
json.stringify(QueryRequest.serializer()).toByteArray(Charsets.UTF_8)
else null
}
override fun close() {}
private val json = Json(JsonConfiguration.Stable)
}
Marc Knaup
06/24/2019, 5:47 PMT
is @Serializable
and not generic then you can use T::class.serializer()
.
That means you need the KClass
of T
..stringify()
with both, the serializer and the instance to serialize.YourGenericSerde
you'll likely have to pass the KClass<T>
to it because you have no other way of accessing it.KSerializer
directly for more flexibility and you wouldn't have to rely on reflection which btw only works on the JVM.Alex Spence
06/24/2019, 6:11 PM@Serializable
data class QueryRequest(val metrics: List<MetricQueryRequest>) {
companion object {
val serde = JsonSerde(serializer())
}
}
data class MetricQueryRequest(val metricDefinition: String, val parameters: Map<String, *>)
class JsonSerde<T>(private val serializer: KSerializer<T>): Serde<T> {
private val json = Json(JsonConfiguration.Stable)
override fun deserializer(): Deserializer<T> = JsonDeserializer()
override fun serializer(): Serializer<T> = JsonSerializer()
override fun configure(configs: MutableMap<String, *>?, isKey: Boolean) {}
override fun close() {}
inner class JsonDeserializer: Deserializer<T> {
@ImplicitReflectionSerializer
override fun deserialize(topic: String?, data: ByteArray?): T? {
return if (data != null)
json.parse(serializer, data.toString(Charsets.UTF_8))
else null
}
override fun close() {}
override fun configure(configs: MutableMap<String, *>?, isKey: Boolean) {}
}
inner class JsonSerializer: Serializer<T> {
override fun serialize(topic: String?, data: T): ByteArray? {
return if (data != null)
json.stringify(serializer, data).toByteArray(Charsets.UTF_8)
else null
}
override fun configure(configs: MutableMap<String, *>?, isKey: Boolean) {}
override fun close() {}
}
}