javascript - 如何将 javascript 数组序列化为 google flatbuffers?

标签 javascript node.js flatbuffers

我是 Google FlatBuffers 的新手。

我正在尝试序列化一个对象数组,以便使用 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_generate.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) 提供什么 var

我知道函数 endDrink() 返回一个变量,我可以调用该变量来关闭缓冲区,但它只是针对一杯饮料。我希望能够向该缓冲区插入许多对象。

这可能吗?我做对了吗?

任何有关该问题的信息将不胜感激。

最佳答案

添加一个表 Drinks { Drinks:[Drink]; } 并将其设为新的 root_type。然后将 endDrink 的所有返回值收集到一个向量中,并用它创建一个 Drinks 表。

此外,请将所有对 createString 的调用移至 startDrink 之前,因为对象不应嵌套。

关于javascript - 如何将 javascript 数组序列化为 google flatbuffers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446451/

相关文章:

c++使用 FlatBuffers 在二进制文件中写入具有循环依赖性的数据

javascript - 对 ASP.NET Web 方法的 AJAX 调用在内容末尾返回垃圾字符,但仅限于 Chrome

javascript - 登录后如何在 React Navigation 中重定向

javascript - MongoDB 对同一集合进行多次查找

node.js - 我如何在 webdriver.io 中以 32 位模式启动 IE

sockets - Net Module Nodester 未监听端口

c# - FlatBuffers:使用 union 发送多种数据包类型

javascript - 带 promise 的条件可观察调用

javascript - 选中复选框时添加类并更改内部 HTML

java - 在 Java 中将编码的 FlatBuffers 表添加到父级