如何在rust中转换bson::Bson至Vec< u8>?

6fe3ivhb  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(151)

我试图获取non-document bson对象值的字节数组:
尝试此操作时:

let value: bson::Bson = bson::Bson::String(String::from("heya"));
bson::to_vec(&value).unwrap();

然后产生这个错误:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: SerializationError { message: "attempted to encode a non-document type at the top level: String" }', ****\src\**\mod.rs:83:43
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

……我没有文档,文档不清楚这是不能做到的,也不清楚如何实现这一点。

dldeef67

dldeef671#

在文档之外,将字符串序列化为BSON意味着什么并不明显。通常,BSON会按顺序存储以下数据:

  • 类型
  • 键+\0
  • 长度
  • 字符串+\0

所以如果你只想要值,那就是字符串本身。如果您想要值加上空结束符,则是前一部分加上空字节。如果你想要长度、值和空结束符,那么就是长度(包括空字节),然后是前面的所有部分。你可以在bson中看到这个。这些都不是有效的BSON,因为它们不包含在文档中,甚至不包括键或类型,因此它们的实用性有限。
bson crate没有公开这个功能,所以你必须在自己的代码中复制/编写它。不过,它们相当简单。
如果你想得到有效的BSON,你可以把它放在一个简单的文档中:

bson::doc! { "0": value }

相关问题