在 JSON 对象中发送 Uint8Array (BSON)

La0*_*0x1 6 javascript arrays json bson uint8array

我在浏览器中使用“ bson ”npm 包将 JSON 对象转换/序列化为 BSON。文档说它返回一个 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))
Run Code Online (Sandbox Code Playgroud)

结果:

结果

fat*_*thy 3

这是因为Bson.serializeBson.deserialize使用 Node.js 之类的Bufferobject

您可以通过使用底层ArrayBuffer创建Uint8Array在线测试)并使用然后使用来纠正此问题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)))
Run Code Online (Sandbox Code Playgroud)