rocketraman
12/01/2020, 2:52 PMCustomCoder@SerializableKSerializer<T>KSerializerCoderKSerializerKTypeclass Avro4kCoder<T: Any>(private val serializer: KSerializer<T>): CustomCoder<T>() {
  override fun encode(value: T, outStream: OutputStream) {
    Avro.default.openOutputStream(serializer) {
      encodeFormat = AvroEncodeFormat.Binary
    }.to(outStream).write(value).flush()
  }
  override fun decode(inStream: InputStream): T? {
    return Avro.default.openInputStream(serializer) {
      decodeFormat = AvroDecodeFormat.Binary(Avro.default.schema(serializer))
    }.from(inStream).next()
  }
}Vampire
12/01/2020, 3:00 PM.serializer()rocketraman
12/01/2020, 3:02 PMCaused by: java.io.NotSerializableException: Foo$$serializerrocketraman
12/01/2020, 3:07 PM.serializer()ClassKClassVampire
12/01/2020, 3:09 PMKClassserializerrocketraman
12/01/2020, 3:09 PMKClass.serializer()Vampire
12/01/2020, 3:10 PMVampire
12/01/2020, 3:10 PMrocketraman
12/01/2020, 3:22 PMrocketraman
12/01/2020, 3:23 PMclass Avro4kCoder<T: Any>(private val serializer: KSerializer<T>): CustomCoder<T>() {
  override fun encode(value: T, outStream: OutputStream) {
    Avro.default.openOutputStream(serializer) {
      encodeFormat = AvroEncodeFormat.Binary
    }.to(outStream).write(value).flush()
  }
  override fun decode(inStream: InputStream): T? {
    return Avro.default.openInputStream(serializer) {
      decodeFormat = AvroDecodeFormat.Binary(Avro.default.schema(serializer))
    }.from(inStream).next()
  }
}rocketraman
12/01/2020, 3:24 PMKSerializer<T>NotSerializableExceptionrocketraman
12/01/2020, 3:25 PMKClassrocketraman
12/01/2020, 3:33 PMKTypeserializer(KType)KSerializerCaused by: java.io.NotSerializableException: kotlin.reflect.jvm.internal.KTypeImplrocketraman
12/01/2020, 3:55 PMGilles Barbier
12/04/2020, 4:15 PMfun getKSerializerOrNull(klass: Class<*>): KSerializer<*>? {
    val companionField = klass.declaredFields.find {
        it.name == "Companion" && isStatic(it.modifiers)
    } ?: return null
    val companion = companionField.get(klass)
    val serializerMethod = try {
        companion::class.java.getMethod("serializer")
    } catch (e: NoSuchMethodException) {
        return null
    }
    if (serializerMethod.returnType.name != KSerializer::class.qualifiedName) {
        return null
    }
    @Suppress("UNCHECKED_CAST")
    return serializerMethod.invoke(companion) as KSerializer<*>
}Gilles Barbier
12/04/2020, 4:15 PMGilles Barbier
12/04/2020, 4:16 PMGilles Barbier
12/04/2020, 4:24 PMfun <T : Any> kserializer(klass: KClass<T>) = when (klass) {
    MyClass1::class -> MyClass1.serializer()
    MyClass2::class -> MyClass2.serializer()
    MyClass3::class -> MyClass3.serializer()
    else -> throw RuntimeException("This should not happen: apply kserializer with  ${klass.qualifiedName}")
} as KSerializer <T>