gpt4 book ai didi

java - 从 kafka 流和 Avro 反序列化同一类时出现 ClassCastException

转载 作者:行者123 更新时间:2023-11-30 01:48:39 25 4
gpt4 key购买 nike

我已经使用 avro-maven-plugin 从 Avro 模式生成了我的 Avro Java 类。我将 avro 类序列化为字节数组,然后将其写入 kafka 主题中。

然后我有一个 kafka 流尝试操纵 avro 数据来做某事。在反序列化过程中,我从同一个类中得到一个 ClassCastExcetion 。我读到这个问题是由于 Avro 在回退时使用不同的 ClassLoader(ClassLoader 的新实例)而产生的。

有一种方法可以强制 Avro 使用调用者的 ClassLoader 或类似的东西吗?

KafkaStream 属性

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

最佳答案

我发现的唯一解决方案是按照建议将 avro 类放入外部 jar 中,然后导入它。

这不是一个好的解决方案,因为它需要大量配置来保持 avro 架构和生成的类的耦合,但这是我发现的唯一解决方案。

我配置了一个 Maven 项目,将 avro 的类 jar 生成到一个目录中,名称中没有工件版本,因此我始终可以导入最新版本,而无需更改 pom。

如果有人发现其他解决方案,请发布

关于java - 从 kafka 流和 Avro 反序列化同一类时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56890432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com