Я пытаюсь десериализовать, т.е. получить объект класса org.apache.avro.generic.GenericRecord
из байтового массива данных Avro. Эти данные содержат заголовок с полной схемой.
Пока я пробовал это:
public List<GenericRecord> deserializeGenericWithSchema(byte[] message) throws IOException {
List<GenericRecord> listOfRecords = new ArrayList<>();
DatumReader<GenericRecord> reader = new GenericDatumReader<>();
DataFileReader<GenericRecord> fileReader =
new DataFileReader<>(new SeekableByteArrayInput(message), reader);
GenericRecord record = null;
while (fileReader.hasNext()) {
listOfRecords.add(fileReader.next(record));
}
return listOfRecords;
}
Но я получаю ошибку:
java .io.IOException: недопустимая кодировка int в
org. apache .avro.io.BinaryDecoder.readInt (BinaryDecoder. java: 145) в
org. apache .avro.io.BinaryDecoder.readBytes (BinaryDecoder. java: 282) в
org. apache .avro.file.DataFileStream.initialize (DataFileStream. java: 112)
at org. apache .avro.file.DataFileReader. (DataFileReader. java: 97)
Однако, если я записываю на диск массив байтов message
и меняю свой функция как:
public List<GenericRecord> deserializeGenericWithSchema(String fileName) throws IOException {
byte[] file = new File(fileName);
List<GenericRecord> listOfRecords = new ArrayList<>();
DatumReader<GenericRecord> reader = new GenericDatumReader<>();
DataFileReader<GenericRecord> fileReader =
new DataFileReader<>(file, reader);
GenericRecord record = null;
while (fileReader.hasNext()) {
listOfRecords.add(fileReader.next(record));
}
return listOfRecords;
}
Работает без нареканий. Я действительно не хочу записывать на диск каждое авро-сообщение, которое я получаю, потому что оно предназначено для работы в режиме реального времени.
Что я делаю не так при первом подходе?