Есть ли лучший способ получить список записей Avro из InputStream? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть ByteArrayInputStream, который был сериализован с List<TestAvroModel>, который является реализацией SpecificRecord.Я не смог найти способ, чтобы Avro узнал о списке, который был сериализован, поэтому я сделал хакерский способ перебрать ByteArrayInputStream.


//TestAvroModel is an implementation of SpecificRecord
List<TestAvroModel> models;
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
for(TestAvroModel model: models) {
    DatumWriter<SpecificRecord> writer = new SpecificDatumWriter<>(model.getSchema());
    Encoder encoder = new EncoderFactory().binaryEncoder(byteArrayStream, null);

    writer.write(model, encoder);
    encoder.flush();
}

//This was pre-serialized with a List of TestAvroModel
ByteArrayInputStream inputStream;

DatumReader<TestAvroModel> reader = new SpecificDatumReader<>(TestAvroModel.getClassSchema());
Decoder decoder = DecoderFactory().get().binaryDecoder(inputStream, null);

List<TestAvroModel> records = new ArrayList<>();
boolean eof = false;
while(!eof) {
    try {
        records.add(reader.read(null, decoder));
    catch(EOFException ex) {
        eof = true;
    }
}

Таким образомработал и читал сериализованный List<TestAvroModel> по одному и добавил его в мой список записей.Хотя перебирать DatumReader до тех пор, пока EOFException не кажется лучшим способом, но я не нашел лучшего способа.

Я не смог найти ничего в библиотеках Avro, которые имели дело с InputStream с несколькими записями Avro в нем.Хотя для того, чтобы Avro мог читать отдельные записи так, как я делал выше, у него должны быть критические точки в потоке.Повторюсь, кто-нибудь знает лучший способ перебрать DatumReader, чем тот, который показан выше?

...