我为现有的类制作了一个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找不到类(T)的无参数构造函数。几乎没有任何自制类,例如
class MyClass {
int value;
MyClass(int v){
value = v;
}
}
和
Schema schema = ReflectData.get().getSchema(MyClass.class);
还有其他方法吗?