【问题标题】:Trailing zeros in byte array from RawBsonDocument.getByteBuffer().array() in org.Bsonorg.Bson 中 RawBsonDocument.getByteBuffer().array() 字节数组中的尾随零
【发布时间】:2020-05-06 10:05:18
【问题描述】:

我正在尝试将 org.Json JSONObject 编码为 BSON 格式字节 []。 但是,我注意到生成的 byte[] 有尾随零。虽然这些零在再次将 byte[] 反序列化为 JSON 时不会造成问题,但它们确实占用了大量空间。 我的代码如下:

#deserializing incoming message
RawBsonDocument bson = new RawBsonDocument((byte[])incomingBson);
json = new JSONObject(bson.toJson());

#serializing response to **bson format**
RawBsonDocument bsonDoc = RawBsonDocument.parse(json.toString());
responseBson = bsonDoc.getByteBuffer().array();

简单地从所有尾随零中修剪 byte[] 不是一种选择,因为 byte[] 可以很好地在末尾有有效的零,而不是由序列化添加的。

编辑 1

我用以下代码解决了这个问题:

RawBsonDocument bsonDoc = RawBsonDocument.parse(json.toString());
responseBson = Arrays.copyOfRange(bsonDoc.getByteBuffer().array(), 0, bsonDoc.getByteBuffer().limit());

我觉得必须是一个更优雅的答案。

【问题讨论】:

  • 您需要考虑ByteBufferlimit(),而不是假设它已满。
  • 好点!我用一个可能的解决方案更新了我的答案,包括limit() 函数。也许您可以将您的评论重新发布为答案,以便我接受?
  • 您应该真正使用get() 方法,而不是像这样回避整个类的设计。
  • 我想我明白你的意思,我同意,这将是理想的情况。但是,在我的场景中,我必须使用一个未知且结构可能不同的 JSON 文件。此外,在我的示例中,它可能是 JSONObject。但输入也可能是一个加载的 JSON 文件。因此,从字符串表示中解析整个对象似乎是处理该问题的最佳方法,而不必担心 JSON 的不同结构。
  • 或者单独迭代 JSON 中的每个标记会产生更好的结果?我也知道,以这种方式这样做,我最终可能会得到一个比简单地发送普通 JSON 更大的字节 []。不过没关系,因为这正是我想要测试的。

标签: java mongodb byte bson org.json


【解决方案1】:

我在类似的课程中也遇到了这个问题,并通过制作内部缓冲区的截断副本解决了这个问题。

由于getByteBuffer返回文档对象保存的内部缓冲区,所以结尾未使用的空格用零填充,导致问题。

这是我的解决方案:

return Arrays.copyOf(writeBuffer.getInternalBuffer(), writeBuffer.getSize());

其中writeBuffer 是一个BasicOutputBuffer 实例,它实现了org.bson 的OutputBuffer 接口。所以这也应该适用于你的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2021-06-14
    • 2013-11-25
    相关资源
    最近更新 更多