我有一种方法,按照以下格式制作一个字节数组。


首先,它得到avroBytes。
然后它迅速压缩它。
然后,它将制作另一个具有特定格式的字节数组,如下所示。


方法如下:

  public static byte[] serialize(final Record record, final int clientId,
      final Map<String, String> holderMap) throws IOException {
    byte[] avroBytes = getAvroBytes(holderMap, record);
    byte[] snappyCompressed = Snappy.compress(avroBytes);

    int size = (2+8+4) + snappyCompressed.length;

    ByteBuffer buffer = ByteBuffer.allocate(size);
    buffer.order(ByteOrder.BIG_ENDIAN);
    buffer.putShort((short) clientId);
    buffer.putLong(System.currentTimeMillis());
    buffer.putInt(snappyCompressed.length);
    buffer.put(snappyCompressed);
    buffer.rewind();

    byte[] bytesToStore = new byte[size];
    buffer.get(bytesToStore);

    return bytesToStore;
  }


现在,我想获得我的实际avroBytes

byte[] bytesToStore = serialize(......);
// now how can I get actual `avroBytes` using bytesToStore?


有什么办法找回它吗?

最佳答案

根据代码,压缩版本从bytesToStore[14]开始,因此一种简单但不一定最有效的方法是从该位置复制字节,然后调用Snappy.uncompress(bytes)

像这样:

public static int HEADER_SIZE = 2 + 8 + 4;

public static byte[] extractAvroBytes(byte[] bytesToStore) throws IOException {
    byte[] bytes = Arrays.copyOfRange(bytesToStore, HEADER_SIZE, bytesToStore.length);
    return Snappy.uncompress(bytes);
}


我尚未对此进行测试,因此可能需要进行一些调整。

根据所使用的Java快照的接口,可能有一些方法可以直接从序列化字节中解压缩数据而无需进行中间复制。

09-30 15:52
查看更多