我正在尝试反序列化,即从字节数组Avro数据中获取类org.apache.avro.generic.GenericRecord
的对象。此数据包含具有完整架构的标头。
到目前为止,我已经尝试过:
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)at
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)
但是,如果我将字节数组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;
}
它完美无瑕。我真的不想将收到的每条Avro消息都写到磁盘上,因为它旨在实时工作。
我的第一种方法做错了什么?