Десериализовать данные Avro из байтовJAVA

Программисты JAVA общаются здесь
Anonymous
Десериализовать данные Avro из байтов

Сообщение Anonymous »

Я пытаюсь десериализовать, т. е. получить объект класса org.apache.avro.generic.GenericRecord из байтового массива данных Avro. Эти данные содержат заголовок с полной схемой.
До сих пор я пробовал это:

Код: Выделить всё

public List deserializeGenericWithSchema(byte[] message) throws IOException {
List listOfRecords = new ArrayList();
DatumReader reader = new GenericDatumReader();
DataFileReader 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)
в org.apache .avro.file.DataFileReader.(DataFileReader.java:97)

Однако, если я запишу на диск сообщение массива байтов и изменю моя функция типа:

Код: Выделить всё

public List deserializeGenericWithSchema(String fileName) throws IOException {
byte[] file = new File(fileName);
List listOfRecords = new ArrayList();
DatumReader reader = new GenericDatumReader();
DataFileReader fileReader =
new DataFileReader(file, reader);

GenericRecord record = null;

while (fileReader.hasNext()) {
listOfRecords.add(fileReader.next(record));
}

return listOfRecords;
}
Работает безупречно. Я действительно не хочу записывать на диск каждое полученное мной avro-сообщение, потому что это должно работать в режиме реального времени.
Что я делаю неправильно в своем первом подходе? п>

Подробнее здесь: https://stackoverflow.com/questions/605 ... from-bytes

Вернуться в «JAVA»