Я создал схему avro для существующих классов (см. https://stackoverflow.com/a/56685173/1206998), затем сумел написать, но не прочитал их, используя:
static <T> T writeAndReadAvro(Schema schema, T t){
// write
DatumWriter<T> writer = new ReflectDatumWriter<>(schema);
ByteArrayOutputStream avroStream = new ByteArrayOutputStream();
BinaryEncoder avroEncoder = EncoderFactory.get().binaryEncoder(avroStream, null);
writer.write(t, avroEncoder);
avroEncoder.flush();
// read
DatumReader<T> reader = new ReflectDatumReader<>(schema);
BinaryDecoder avroDecoder = DecoderFactory.get()
.binaryDecoder(avroStream.toByteArray(), null);
T rebuild = reader.read(null, avroDecoder); // *** failure ***
return rebuild
}
Ошибка происходит, потому что avro не находит No-конструктор аргументов для классов (T). Сбой почти во всех домашних классах, таких как
class MyClass {
int value;
MyClass(int v){
value = v;
}
}
и
Schema schema = ReflectData.get().getSchema(MyClass.class);
Есть ли другой способ?