我正在尝试使用Avro&amp ;;发送一个对象列表Kafka,我的主要问题是我的列表大小可能会经常更改,因此我不知道如何构建动态Avro架构,因为据我所知,Avro架构意味着众所周知的结构。
有人知道怎么做吗?
答案 0 :(得分:0)
我认为最简单的方法是 用列表创建一个类, 例如:
public class AvroObj {
private List<TestObj> list;
public List<TestObj> getList() {
return list;
}
public void setList(List<TestObj> list) {
this.list = list;
}
}
创建架构:
Schema schema = ReflectData.get().getSchema(AvroObj.class);
使用ReflectDatumWriter将其序列化为字节(我提供它可能会导致其他数据编写者捕获ClassCastException)
try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null);
DatumWriter<AvroObj> writer = new ReflectDatumWriter<>(schema);
writer.write(avroObj, encoder);
encoder.flush();
byte[] bytes = out.toByteArray();
}
然后用kafka producer发送字节。
消费者收到的反序列化字节:
DatumReader<AvroObj> reader1 = new ReflectDatumReader<AvroObj>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(bytes, null);
AvroObj decodedAvroObj = reader1.read(null, decoder);