2016-02-17 1 views
1

Я новичок в плоских буферах Google.как сериализовать массив javascript для плоских буферов Google?

Я пытаюсь сериализовать массив объектов, чтобы передать его в Интернете с помощью nodeJS.

Сначала я создал FBS файл и скомпилировать его с flatc:

namespace MyAlcoholist; 

table Drink { 
drink_type_name: string; 
drink_company_name: string; 
drink_brand_name: string; 
drink_flavor_type_name : string; 
liquid_color_type_name : string; 
liquid_color_is_transparent : bool; 
alcohol_vol : float; 
calories_for_100g : uint; 
global_image_id: ulong; 
drink_flavor_id: ulong; 
} 

root_type Drink; 

компилятор сгенерировал файл с именем drink_generated.js.

тогда я создал следующий служебный модуль в Nodejs.

var flatbuffers = require('../js/flatbuffers').flatbuffers; 
var builder = new flatbuffers.Builder(1); 

var drink = require('../fbs/drink_generated').MyAlcoholist; // Generated by `flatc`. 

function drinkArrayToIdl(drinkArray) { 
drinkArray.forEach(function (element, index, array) { 
    var drinkObj = element; 
    drink.Drink.startDrink(builder); 
    var drinkBrandName = builder.createString(drinkObj.drink_brand_name); 
    var drinkCompanyName = builder.createString(drinkObj.drink_company_name); 
    var drinkflavorTypeName = builder.createString(drinkObj.drink_flavor_type_name); 
    var drinkTypeName = builder.createString(drinkObj.drink_type_name); 
    var liquidColorTypeName = builder.createString(drinkObj.liquid_color_type_name); 
    drink.Drink.addAlcoholVol(builder, drinkObj.alcohol_vol); 
    drink.Drink.addCaloriesFor100g(builder,drinkObj.calories_for_100g); 
    drink.Drink.addDrinkBrandName(builder,drinkBrandName); 
    drink.Drink.addDrinkCompanyName(builder,drinkCompanyName); 
    drink.Drink.addDrinkFlavorId(builder,drinkObj.drink_flavor_id); 
    drink.Drink.addDrinkFlavorTypeName(builder, drinkflavorTypeName); 
    drink.Drink.addDrinkTypeName(builder,drinkTypeName); 
    drink.Drink.addGlobalImageId(builder,drinkObj.global_image_id); 
    drink.Drink.addLiquidColorIsTransparent(builder,drinkObj.is_transparent); 
    drink.Drink.addLiquidColorTypeName(builder,liquidColorTypeName); 
    drink.Drink.endDrink(builder); 
}) 
} 

module.exports.drinkArrayToIdl=drinkArrayToIdl; 

теперь основан на https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html мне нужно, чтобы закрыть буфер с builder.finish(var), а затем принести буфер с builder.dataBuffer().

У меня возникли проблемы с пониманием того, что вар мне нужно сделать, чтобы обеспечить builder.finish(var)

Я знаю, что функция endDrink() возвращает переменную, которую я могу назвать, чтобы закрыть буфер, но это только для одного напитка. Я хочу иметь возможность вставить в объект много объектов.

это возможно? я делаю это правильно?

вся информация относительно выпуска была бы принята с благодарностью.

ответ

0

Добавьте table Drinks { drinks:[Drink]; } и сделайте это своим новым root_type. Затем соберите все возвращаемые значения endDrink в векторе и создайте таблицу Drinks.

Также переместите все вызовы на createString до startDrink, так как объекты не должны быть вложенными.

Смежные вопросы