2013-04-11 41 views
3

的WebSocket傳遞我想編碼JavaScript對象ArrayBuffer元素BSON和轉移過來websocket。但是,序列化的BSON對象比應該大10倍。如何序列ArrayBuffer成BSON對象在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 
    } 
} 

爲什麼不通過WebSocket的直接傳輸,而不是ArrayBuffer編碼呢? Websockets可以直接傳輸二進制數據,而無需任何額外的編碼。您可能需要做一些工作,因爲您必須將其他屬性作爲單獨的對象發送,但這可能不是世界的盡頭。

+0

昨晚我做了一些更多的實驗,看來BSON可以正確地將Node.js Buffer對象作爲二進制序列化。直接傳輸ArrayBuffer絕對是我的選擇。但正如你所說,我必須分別轉移其他屬性或編寫專有的解析器。我會做一些基準測試,看看哪種方法更有效。 – 2013-04-11 18:02:29

+0

如果你可以做節點'緩衝區'然後肯定做到這一點。因爲你使用了'ArrayBuffer',所以我認爲你有一些原因不是'Buffer',對不起:P – loganfsmyth 2013-04-11 21:46:11

相關問題