Я сгенерировал свои классы Avro Java из схемы Avro с помощью avro-maven-plugin. Я сериализую свой класс avro в байтовый массив и записываю его в тему kafka.
Тогда у меня есть поток kafka, который пытается манипулировать данными avro, чтобы что-то сделать. В процессе десериализации я получаю ClassCastExcetion от того же класса. Я читал, что эта проблема возникает из-за другого ClassLoader, который Avro использует при резервном (новый экземпляр ClassLoader).
Есть способ заставить Avro использовать ClassLoader вызывающего абонента или что-то подобное?
KafkaStream properties
this.props = new Properties();
this.props.put(StreamsConfig.APPLICATION_ID_CONFIG, "test");
this.props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
this.props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
this.props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.ByteArray().getClass());
Я использую ключ String и сериализованный байтовый массив avro, затем мне нужно вручную десериализовать полезную нагрузку avro.
Я использую декодер Avro для десериализации следующим образом:
AvroPayload stp = AvroPayload.fromByteBuffer(ByteBuffer.wrap(bytes));
или даже так:
AvroPayload stp = AvroPayload.getDecoder().decode(ByteBuffer.wrap(bytes));
В первой версии, отладке, я вижу, что если я останусь в контексте сгенерированного класса avro, массив байтов будет правильно десериализован в класс AvroPayload. Возвращение этого нового экземпляра, возможно, выдает ClassCastException