我正在阅读AVRO format spec并面对以下细节:
文件数据块包括:
- 指示此块中对象计数的long。
- 一个long,表示在应用任何编解码器后,当前块中序列化对象的字节大小
所以,看看<table>
的java实现,我找到了这个:
org.apache.avro.file.DataFileStream::hasNextBlock
我们会检查是否boolean hasNextBlock() {
try {
if (availableBlock) return true;
if (vin.isEnd()) return false;
blockRemaining = vin.readLong(); // read block count
blockSize = vin.readLong(); // read block size
if (blockSize > Integer.MAX_VALUE ||
blockSize < 0) {
throw new IOException("Block size invalid or too large for this " +
"implementation: " + blockSize);
}
blockCount = blockRemaining;
availableBlock = true;
return true;
} catch (EOFException eof) {
return false;
} catch (IOException e) {
throw new AvroRuntimeException(e);
}
}
,但我们不检查是否blockSize < 0
。
如果某个数据块的blockRemaining读取小于零,那么它是一个有效的avro文件吗?
特别是,有效数据块是否可以使用以下字节blockRemaining < 0
开头?从zig-zag var-lenght编码解码的byte[]{'O', 'b', 'j', 1}
字节为负数。