В одном из проектов, который я сейчас начинаю делать, стоит задача в пересылке данных по протоколу WebSocket. На клиенте обычная "web морда" с логикой на javascript и в качестве сервера используется Tornado. По умолчанию Tornado работает с JSON (есть встроенные десериализатор и сериализатор). JSON отлично обрабатывается яваскриптом и не требует никаких танцев с бубном.
Так вот. Есть ли смысл использовать вместо JSON бинарный формат BSON?
На данный момент вижу такие
плюсы:
- меньший трафик между клиент-сервер
- поддержка большего количества типов данных
- Вроде как более быстрая обработка формата.
И обнаруженные
минусы:
- необходимость использования дополнительных библиотек/модулей для работы с форматом
- т.к. BSON данные приходят на клиент в формате blob/ArrayBuffer, то его приходится конвертировать в Uint8Array (TypedArray кароче говоря). Эта конвертация не внушает мне доверия. Не производительно. С другой стороны, может есть более элегантное решение это задачки? Что посоветуете?
Сейчас я принимаю ответ сервера так:
wsconnection = new WebSocket(---);
wsconnection.binaryType = 'arraybuffer';
wsconnection.onmessage = function (event) {
console.log(BSON.deserialize(new Uint8Array(event.data)));
}
Может существует более разумное решение? Быть или не быть?
Предполагается пересылать в основном массивы данных небольшого размера. Но и хотелось бы иметь возможность пересылать файлы, в рамках формата(я имею в виду не статику. Статика будет под контролем nginx, если вы подумали...).
UPD:
Обновил код десериализации.