У меня есть 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
, чем тот, который показан выше?