Как напрямую написать / прочитать существующий (value) класс из avro? - PullRequest
0 голосов
/ 20 июня 2019

Я создал схему 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);

Есть ли другой способ?

...