Sebastian Schuberth
05/16/2022, 3:39 PMtoString()
? Currently, I'm writing code like
@Serializer(File::class)
object FileSerializer : KSerializer<File> {
override fun serialize(encoder: Encoder, value: File) = encoder.encodeString(value.toString())
override fun deserialize(decoder: Decoder) = File(decoder.decodeString())
}
@Serializer(URI::class)
object URISerializer : KSerializer<URI> {
override fun serialize(encoder: Encoder, value: URI) = encoder.encodeString(value.toString())
override fun deserialize(decoder: Decoder) = URI(decoder.decodeString())
}
but this duplication seems rather dumb. Can I somehow generalize these serializers into one, and use that single serializer for both File
and URI
?phldavies
05/16/2022, 3:57 PMclass ToStringSerializer<T: Any>(private val ctor: (String) -> T): KSerializer<T> {
override fun serialize(encoder: Encoder, value: T) = encoder.encodeString(value.toString())
override fun deserialize(decoder: Decoder) = ctor(decoder.decodeString())
}
@Serializer(File::class)
object FileSerializer: ToStringSerializer(::File)
@Serializer(Uri::class)
object URISerializer: ToStringSerializer(::URI)
Sebastian Schuberth
05/16/2022, 4:04 PMphldavies
05/16/2022, 4:06 PM= TODO()
or something), and use an annotation on each property you want to use it on.ephemient
05/16/2022, 4:06 PMabstract class ByString<T>(serialName: String) {
abstract fun parse(string: String): T
override val serialDescriptor: SerialDescriptor = PrimitiveSerialDescriptor(serialName, PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: T) {
encoder.encodeString(value.toString())
}
override fun deserialize(decoder: Decoder): T = parse(decoder.decodeString())
}
object FileSerializer : ByString<File>("java.io.File") {
override fun parse(string: String): File = File(string)
}
object URISerializer : ByString<URI>("java.net.URI") {
override fun parse(string: String): URI = URI(string)
}
ephemient
05/16/2022, 4:07 PMphldavies
05/16/2022, 4:07 PMSebastian Schuberth
05/16/2022, 4:09 PM@Serializer
?Sebastian Schuberth
05/16/2022, 4:10 PMephemient
05/16/2022, 4:14 PMSebastian Schuberth
05/16/2022, 4:44 PMopen class ToStringSerializer<T: Any>(serialName: String, private val ctor: (String) -> T): KSerializer<T> {
override val descriptor = PrimitiveSerialDescriptor(serialName, PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: T) = encoder.encodeString(value.toString())
override fun deserialize(decoder: Decoder) = ctor(decoder.decodeString())
}
object FileSerializer : ToStringSerializer<File>(File::class.qualifiedName!!, ::File)
object URISerializer : ToStringSerializer<URI>(URI::class.qualifiedName!!, ::URI)
Sebastian Schuberth
05/16/2022, 4:45 PMPaul Griffith
05/16/2022, 8:59 PMinline fun <reified T : Any> ToStringSerializer(noinline ctor: (String) -> T): ToStringSerializer<T> {
return ToStringSerializer(T::class.java.simpleName, ctor)
}
object FileSerializer : KSerializer<File> by ToStringSerializer(::File)