在 JSON 对象中发送 Uint8Array (BSON)

Sending Uint8Array (BSON) in a JSON object

我在浏览器中使用“bson”npm 包将 JSON 对象转换/序列化为 BSON。文档说它 returns 一个 Node.js 缓冲区。 Node.js 的文档说缓冲区的类型是 'Uint8Array'。现在我想在另一个 JSON 对象 (infoJSON) 中发送这个 Uint8Array,但是 JSON 不支持 Uint8Array。我尝试将缓冲区 (Uint8Array) 转换为简单数组,将其插入 JSON 对象 (infoJSON) 中,然后直接从 JSON 对象中将其转换回 Uint8Array .但是这个新的 Uint8Array 不能反序列化回原来的 person 对象(看结果)。坏了。

为什么我要使用 BSON? 我想将原始对象拆分成多个块,以通过具有数据大小限制的 WebRTC 数据通道发送它。我需要能够识别每个块(类型)。这就是我使用嵌套对象的原因。

  var personJSON = { 'name': 'sarah' } // JSON
  var personBuffer = Bson.serialize(personJSON) // Uint8Array
  var personArray = Array.from(personBuffer) // Simple array
  var infoJSON = { 'count': 1, 'person': personArray } // Inserting array into JSON
  var personUint8Array = Uint8Array.from(infoJSON.person) // Converting array back to Uint8Array
  console.log('deserializedObj:')
  console.log(Bson.deserialize(personUint8Array))

结果:

您不能通过 JSON 发送二进制数据或 JSON 对象。如果你想这样做,那么我建议你用 base64 编码你的 unit8array,像这样:

  let base64 = btoa(String.fromCharCode.apply(null, personUnit8Array));

现在您只需将该字符串附加到另一个 JSON 并将其发送。要将其转换回 unit8Array,只需执行以下操作:

  let personUnit8Array = new Unit8Array(atob(base64).split("").map(
      (char)=>char.charCodeAt(0)
    )
   );

我建议您避免尝试使用 JSON 支持的对象类型以外的其他对象类型,如果您需要这样做,那么您可能不需要 JSON 格式。

这是因为Bson.serialize and Bson.deserialize use a Node.js like Buffer object.

您可以通过使用基础 ArrayBuffer 创建 Uint8Array (test online) 并使用然后使用 Buffer.from :

来更正此问题
var personJSON = { 'name': 'sarah' } // JSON
var personBuffer = new Uint8Array(Bson.serialize(personJSON).buffer) // Uint8Array
var personArray = Array.from(personBuffer) // Simple array
var infoJSON = { 'count': 1, 'person': personArray } // Inserting array into JSON
var personUint8Array = Uint8Array.from(infoJSON.person) // Converting array back to Uint8Array
console.log('deserializedObj:')
console.log(Bson.deserialize(Buffer.from(personBuffer)))