2013-04-11 8 views
3

Я хочу, чтобы закодировать объектов JavaScript с ArrayBuffer элемента в BSON и передать его на websocket. Однако сериализованный объект BSON в 10 раз больше, чем должен быть.как сериализовать ArrayBuffer в объект BSON для передачи WebSocket в JavaScript

Код что-то вроде этого:

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

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

Мое понимание BSON сериализатором должно быть неправильным. Кто-нибудь знает, как я могу создать компактный объект BSON с бинарным полем буфера?

ответ

-1

Оглядываясь на реализацию 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 
    } 
} 

Почему бы не передать ArrayBuffer непосредственно через WebSocket вместо кодирования его? Websockets может напрямую передавать двоичные данные без необходимости дополнительной кодировки. Возможно, вам придется немного поработать, так как вам придется отправлять другие атрибуты как отдельный объект, но это может быть не конец света.

+0

Я провел еще несколько экспериментов прошлой ночью, и кажется, что BSON может сериализовать буферный объект Node.js правильно как двоичный. Передача ArrayBuffer напрямую определенно является вариантом для меня. Но, как вы сказали, мне нужно либо передать другие атрибуты отдельно, либо написать собственный парсер. Я сделаю некоторый бенчмаркинг и посмотрю, какой метод более эффективен. –

+0

Если вы можете сделать Node 'Buffer', тогда обязательно сделайте это. Я предположил, что у вас есть причина не «Буффер», так как вы использовали «ArrayBuffer», извините: P – loganfsmyth