问题标签 [flatbuffers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
927 浏览

javascript - 如何将 javascript 数组序列化为谷歌平面缓冲区?

我是谷歌平面缓冲区的新手。

我正在尝试序列化一组对象,以便使用 nodeJS 在网络上传输它。

首先我创建了一个 fbs 文件并用 flatc 编译它:

编译器生成了一个名为drink_generated.js.

然后我在 Nodejs 中创建了以下实用程序模块。

现在基于https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html我需要关闭缓冲区,builder.finish(var)然后使用builder.dataBuffer().

我在理解我需要提供什么 var 时遇到问题builder.finish(var)

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

那可能吗?我做对了吗?

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

0 投票
1 回答
604 浏览

javascript - flatbuffers 未定义

我正在编写一个使用谷歌平面缓冲区的 nodeJs 应用程序。

我在我的 macbook pro 上安装了 flatc 并编译了以下架构:

命名空间 MyAlcoholist;

架构文件名为drink.fbs,它生成了一个名为drink_generated.js 的javascript 文件

我将此文件包含在我的 nodejs 应用程序中,并使用以下代码向其中添加数据。这是我的 flatBufferUtil.js 实用程序文件。

现在,当我执行此功能时,它会因错误而失败flatbuffers is not defined

我调试了我的代码,我看到它在以下代码行中归档:

如果我进入 addDrinkFlavorId 函数,我会在drinks_generted.js 中看到这段代码:

正如您所看到的,它使用flatbuffers.Long.ZERO了 flatbuffers,但该文件中根本没有定义 flatbuffers。编译没有提供任何错误,所以我错过了什么?

0 投票
1 回答
263 浏览

java - FlatBuffers BufferHasIdentifier return false

I am trying to transfer data through TCP with Flatbuffers, The server is java but the client is C#, which complicates it heavily.

The schema i am using is:

How i send it c#:

How i receive it java:

Handle:

0 投票
1 回答
1253 浏览

javascript - 反序列化谷歌平面缓冲区

我有一个使用谷歌平面缓冲区的 nodejs 应用程序。

饮料模式的 fbs 文件:

编译它flatc -s drinks.fbs,它生成了js文件drinks_generated.js。到目前为止,一切都很好。

我在我的 nodejs 服务器中使用以下代码从数组中准备和创建平面缓冲区:

flatBuffersUtil.js

flatBuffersUtil.js 的用法:

当我收到缓冲区时,客户端使用 angularjs 1.5.0 完成,我尝试使用以下代码从中创建一个对象:

在主索引文件中:

然后在角度控制器中:

问题是函数MyAlcoholist.Drinks.getRootAsDrinks(buffer);失败并出现以下错误:

现在.. 生成的drinks_generated.js 文件中的函数代码如下:

所以 bb 应该是一个带有函数 position() 的字节缓冲区类型,但我收到的是一个字节对象。我想我需要先或以某种方式对其进行类型转换......但这只是一个猜测。

有任何想法吗?

更新

好的,首先我将drinksArrayToBuffer 函数修改为以下代码:

现在在服务器端,我能够反序列化缓冲区并正确使用数据。问题在于客户端的反序列化。

在我发送缓冲区后,客户端收到以下对象:

现在.. 我创建了以下函数来将缓冲区转换为客户端的 json 对象:

当我执行此功能时,饮料的长度为零。所以缓冲区似乎是空的。

现在我认为问题出在以下代码上:

我想我需要以其他方式将数据转换为字节缓冲区。

我知道我需要提供flatbuffers.ByteBuffer一个字节数组,所以我尝试做以下事情:

但结果是一样的。

有任何想法吗?

0 投票
1 回答
1465 浏览

c++ - Flatbuffers 编码然后解码 C++ 双数组 + 表 + 联合返回垃圾

我正在填写一些 flatbuffer 消息,但是当我编码然后解码它们时,我会得到垃圾。我没有包含完整的消息以避免无关信息,但我能够成功提取联合组件的枚举值。但是,当我提取枚举标识的类型时,我打印出的双精度数组包含垃圾,如下图所示。

以下是缓冲区的重要部分:

输入输出:

联合状态.fbs:

ArmControlState.fbs:

编码:

解码:

0 投票
1 回答
3471 浏览

c++ - flatbuffers 中的多个根表

我正在检查 Flatbuffers 以实现通信协议。当收到一条消息时,在我的情况下它可能包含许多不同的表。如果我理解正确,在 Flatbuffers 中实现这一点的方法是使用一个“根”表,该表在一个联合中包含每个可能的不同表。

就我而言,我已经知道传入的类型(类型是标题的一部分)=> 我不一定需要能够将每种类型放在一个表中。但是,似乎不可能将多个表标记为“根”类型。这意味着如果我已经定义了表Foo并且Bar我只能获得一个GetFoo()或一个GetBar()反序列化方法,但不能同时获得两者。

我假设也可以将定义拆分到不同的模式文件中,但由于它们将共享一些子类,我还需要一个共享模式文件来用于公共定义。对于简单的情况,这似乎比必要的要复杂一些。

是否有另一种方法可以使用 Flatbuffers 反序列化多种不同类型?

0 投票
1 回答
1924 浏览

java - 如何通过网络发送 FlatBuffers ByteBuffer?

我想通过网络将 ByteBuffer 从FlatBuffers发送到 Android 应用程序。我试过使用echo $builder->sizedByteArray,但后来我想知道如何反序列化这个字符串。

0 投票
1 回答
1962 浏览

c++ - 在 C++ 中读取通过 ZMQ 发送的 Flatbuffers 对象会引发未处理的异常

我正在尝试通过 ZMQ 通过网络发送一个相当大的 Flatbuffers 对象,然后使用 C++ 读取它。访问对象时,我得到了我不知道如何解决的未处理异常。即使这个最小的例子也失败了:

flatbuffers 架构:

使用 REP 套接字的 main.cpp:

使用 REQ 套接字的 main.cpp:

此代码运行良好并显示(我认为)每个程序正在接收的原始缓冲区。奇怪的是,它并没有改变,尽管消息的内容应该是。如果我取消注释最后两行并尝试访问 inmsg->testNumber(),我会收到以下错误消息:

我之前已经通过 ZMQ 成功发送了 Flatbuffers 对象,但我还没有在 C++ 中读取它们。我很确定我遵循了Flatbuffers 教程,但显然出了点问题。指针?缓冲区大小?无论哪种方式,我都会感谢帮助。


编辑:为了澄清我对已接受答案的评论,违规行是:

它必须更改为:

阅读此问题的人也可能有兴趣知道我后来遇到了一个错误,该错误是在未按正确顺序调用 FlatBufferBuilder 函数时发生的。显然,Flatbuffers 对象的构建顺序很重要。我花了一段时间才找到那个——新手要小心。

0 投票
2 回答
549 浏览

c++ - 在调试(c ++ MSVC)中提高flatbuffer性能的任何方法

我正在尝试在我的公司中使用 flatbuffers 作为原始结构的替代品。我们需要序列化的类相当大,我注意到 flatbuffer 序列化的开销超过了我们在运行调试构建时所能承受的。

我用以下简单的测试程序复制了我的发现(数据类型类似于我们生产代码中的数据类型):

在我的电脑上调试大约需要 40 秒(发布时大约需要 400 毫秒)。我正在寻找任何方法来提高调试版本的性能。分析表明大部分时间都花在了 std::vector 代码上,所以我尝试将 _ITERATOR_DEBUG_LEVEL 设置为零,但这并没有带来任何显着的性能提升。

0 投票
1 回答
289 浏览

c# - 将旧缓冲区封装在新缓冲区中

所以我有这样的计划:

其中 table Sample 有多个字符串向量,并且它的实例非常大。我的文件系统上有很多带有示例实例的文件,这花了我一些时间来创建。现在我想随机取 2 个文件,将它们读入内存并创建一个封装它们的新请求。

我正在使用 c# 并且这条线有效:

但我似乎找不到在新的 Request 实例中引用它们的方法。我需要某种方式将这些缓冲区按原样添加到新构建器,然后将它们的偏移量传递给同一个构建器中的新请求。在新的构建器中重新构建它们不会有效。

我怎样才能做到这一点?