从字节反序列化Avro数据

时间:2020-03-05 20:03:08

标签: java avro

我正在尝试反序列化,即从字节数组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消息都写到磁盘上,因为它旨在实时工作。

我的第一种方法做错了什么?

0 个答案:

没有答案