如何在javascript中将ArrayBuffer序列化为websocket传输的BSON对象

如何在javascript中将ArrayBuffer序列化为websocket传输的BSON对象,javascript,node.js,mongodb,bson,arraybuffer,Javascript,Node.js,Mongodb,Bson,Arraybuffer,我想用ArrayBuffer元素将javascript对象编码为BSON并通过websocket传输。但是,序列化的BSON对象比它应该的大10倍 代码如下所示: var A = {buffer: new ArrayBuffer(1024)}; bson_buffer_size = BSON.calculateObjectSize(A) // returns 9164, I am expecting ~1024 我对BSON序列化程序的理解肯定是错误的。有人知道如何创建带有二进制缓冲区字段的

我想用ArrayBuffer元素将javascript对象编码为
BSON
并通过
websocket
传输。但是,序列化的BSON对象比它应该的大10倍

代码如下所示:

var A = {buffer: new ArrayBuffer(1024)};

bson_buffer_size = BSON.calculateObjectSize(A) // returns 9164, I am expecting ~1024

我对BSON序列化程序的理解肯定是错误的。有人知道如何创建带有二进制缓冲区字段的紧凑BSON对象吗?

查看
js BSON
实现,它看起来像是在内部使用
ArrayBuffer
来生成序列化数据,但如果不支持将ArrayBuffers序列化为二进制数据,则将其视为一个对象

例如,如果通过序列化循环运行它,则会得到以下输出:

BSON.deserialize(BSON.serialize({buffer: new ArrayBuffer(1024)}));

// Outputs:
{
  buffer: {
    '0': 0,
    '1': 0,
    // And so on
    '1023': 0,
    byteLength: 1024
  }
}

为什么不直接通过websocket传输
ArrayBuffer
,而不是对其进行编码?WebSocket可以直接传输二进制数据,而无需任何额外的编码。您可能需要做一些工作,因为您必须将其他属性作为单独的对象发送,但这可能不是世界末日。

我昨晚又做了一些实验,BSON似乎可以将Node.js缓冲区对象正确地序列化为二进制。直接转移ArrayBuffer绝对是我的选择。但正如您所说,我要么单独传输其他属性,要么编写一个专有解析器。我会做一些基准测试,看看哪种方法更有效。如果你能做Node
Buffer
s,那么一定要这样做。我假设您有理由不使用
缓冲
,因为您使用的是
阵列缓冲
,对不起:P