Сериализуемое исключение ReflectionCache

#kotlin #apache-beam

Вопрос:

Короче говоря, я разработал конвейер с использованием apache beam поток данных на Java, и все работало так, как ожидалось. Пару недель назад я начал конвертировать свой java-код в kotlin, и именно тогда я начал видеть эту проблему.

Пример кода:

 private val mapper = ObjectMapper().registerKotlinModule()
// read json file
  val lines = pipeline.apply("Reading Input Data ", TextIO.read().from(options.inputFile))

    // parse json
 val exchangeObject = lines.apply("Convert Data to ExchangeObject model data", ParseJsons.of(ExchangeObject::class.java).withMapper(objectMapper)).setCoder(SerializableCoder.of(ExchangeObject::class.java))
 

Когда код пытается проанализировать Json, происходит сбой кода с:

 Caused by: java.io.NotSerializableException: com.fasterxml.jackson.module.kotlin.ReflectionCache
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185)
    at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1553)
    at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
    at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
 

Кто-нибудь видел это раньше?

Ответ №1:

Похоже, это проблема с https://github.com/FasterXML/jackson-module-kotlin/issues/245.

Это связано с Apache Beam по одной причине: лямбды сериализуются, поэтому их можно запускать в распределенной системе. Рекомендация состоит в том, чтобы сделать его временным, а затем воссоздать его заново. Расширение Джексона луча имеет ParseJsons преобразование, которое не соответствует этой практике.