转储没有模式的 Avro 字节

Dump Avro bytes without schema

我正在编写一个简单的 Java 工具来在控制台上转储 kafka 主题的内容。 Kafka 记录的值恰好是一个 Avro 对象。我希望能够以某种人类可读的格式转储 Avro 数据。我想知道是否有一种方法可以将一个 Avro 对象(我有一个字节数组)的内容打印成某种人类可读的格式?

KafkaConsumer<String, byte[]> kafkaConsumer = createConsumer(); //Create a consumer with my config

ConsumerRecords<String, byte[]> records = kafkaConsumer.poll(200);

for (ConsumerRecord<String, byte[]> record : records) {
    byte[] myAvroDataAsBytes = record.value();
    //TODO: How do I print these bytes without knowing the schema?
}

在上面的代码片段中,我正在寻找一种方法来打印 myAvroDataAsBytes 的内容,而无需了解与 Avro 对象字节关联的模式。

documentation 中所述,不提供模式就无法解析数据。

[...] Avro data itself is not tagged with type information. The schema is required to parse data.

与protobuf不同,Avro在序列化数据中不存储任何字段信息。这是一个无法规避的设计选择。

关于这种方法的优缺点的文章很多。 Schema evolution in Avro, Protocol Buffers and Thrift 作者 Martin Kleppmann 是一个很好的介绍,可以帮助您了解事物的幕后工作原理及其含义。