如何直接从Avro写入/读取现有(值)类?

时间:2019-06-20 13:53:54

标签: deserialization avro pojo

我为现有的类制作了一个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);

还有其他方法吗?

0 个答案:

没有答案