``` @Serializable sealed class Proto { @Serial...
# serialization
j
Copy code
@Serializable
sealed class Proto {
    @Serializable
    data class Hello(val greeting: String) : Proto()
    @Serializable
    data class Bye(val name: String) : Proto()
}

object ProtoSerializer : KSerializer<Proto> {
    override val serialClassDesc: KSerialClassDesc = SerialClassDescImpl(Proto::class.qualifiedName!!)
    override fun load(input: KInput): Proto {
        val type = input.readStringValue()
        println(type)
        return input.read()
    }
    override fun save(output: KOutput, obj: Proto) {
        output.writeStringValue(obj::class.simpleName!!)
        when(obj) {
            is Proto.Hello -> {
                output.write(obj)
            }
            is Proto.Bye -> {
                output.write(obj)
            }
        }
    }
}


fun main(args: Array<String>) {
    val json = jsonWithContext()
    val payload = json.stringify(Proto.Hello("hi!") as Proto)
    println(payload)
    val data = json.parse<Proto>(payload)
    println(data)
}