我有一个window.open('../../page/page2','_blank');
序列化为ByteArrayInputStream
的序列,该序列是SpecificRecord的实现。我找不到Avro知道序列化列表的方法,因此我采用了一种怪异的方式来遍历List<TestAvroModel>
。
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
似乎不是最好的方法,但是我还没有找到更好的方法。
我在Avro库中找不到处理EOFException
且其中包含多个Avro记录的任何内容。尽管它必须要在流中具有断点,才能使Avro像我上面那样读取单个记录。重申一下,有没有人比上面显示的方法更好地遍历InputStream
?
答案 0 :(得分:0)
Decoder
似乎为此定义了isEnd(): Boolean
:
如果当前BinaryDecoder在其源结尾处,则返回true 数据,并且在没有抛出EOFException或 其他IOException。
这应该有效:
...
while(!decoder.isEnd()) {
records.add(reader.read(null, decoder));
}