问题标签 [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.
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()
返回我可以调用以关闭缓冲区的变量,但它只是为了一杯饮料。我希望能够向该缓冲区插入许多对象。
那可能吗?我做对了吗?
任何有关该问题的信息将不胜感激。
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。编译没有提供任何错误,所以我错过了什么?
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:
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
一个字节数组,所以我尝试做以下事情:
但结果是一样的。
有任何想法吗?
c++ - Flatbuffers 编码然后解码 C++ 双数组 + 表 + 联合返回垃圾
我正在填写一些 flatbuffer 消息,但是当我编码然后解码它们时,我会得到垃圾。我没有包含完整的消息以避免无关信息,但我能够成功提取联合组件的枚举值。但是,当我提取枚举标识的类型时,我打印出的双精度数组包含垃圾,如下图所示。
以下是缓冲区的重要部分:
输入输出:
联合状态.fbs:
ArmControlState.fbs:
编码:
解码:
c++ - flatbuffers 中的多个根表
我正在检查 Flatbuffers 以实现通信协议。当收到一条消息时,在我的情况下它可能包含许多不同的表。如果我理解正确,在 Flatbuffers 中实现这一点的方法是使用一个“根”表,该表在一个联合中包含每个可能的不同表。
就我而言,我已经知道传入的类型(类型是标题的一部分)=> 我不一定需要能够将每种类型放在一个表中。但是,似乎不可能将多个表标记为“根”类型。这意味着如果我已经定义了表Foo
并且Bar
我只能获得一个GetFoo()
或一个GetBar()
反序列化方法,但不能同时获得两者。
我假设也可以将定义拆分到不同的模式文件中,但由于它们将共享一些子类,我还需要一个共享模式文件来用于公共定义。对于简单的情况,这似乎比必要的要复杂一些。
是否有另一种方法可以使用 Flatbuffers 反序列化多种不同类型?
java - 如何通过网络发送 FlatBuffers ByteBuffer?
我想通过网络将 ByteBuffer 从FlatBuffers发送到 Android 应用程序。我试过使用echo $builder->sizedByteArray
,但后来我想知道如何反序列化这个字符串。
c++ - 在 C++ 中读取通过 ZMQ 发送的 Flatbuffers 对象会引发未处理的异常
我正在尝试通过 ZMQ 通过网络发送一个相当大的 Flatbuffers 对象,然后使用 C++ 读取它。访问对象时,我得到了我不知道如何解决的未处理异常。即使这个最小的例子也失败了:
flatbuffers 架构:
使用 REP 套接字的 main.cpp:
使用 REQ 套接字的 main.cpp:
此代码运行良好并显示(我认为)每个程序正在接收的原始缓冲区。奇怪的是,它并没有改变,尽管消息的内容应该是。如果我取消注释最后两行并尝试访问 inmsg->testNumber(),我会收到以下错误消息:
我之前已经通过 ZMQ 成功发送了 Flatbuffers 对象,但我还没有在 C++ 中读取它们。我很确定我遵循了Flatbuffers 教程,但显然出了点问题。指针?缓冲区大小?无论哪种方式,我都会感谢帮助。
编辑:为了澄清我对已接受答案的评论,违规行是:
它必须更改为:
阅读此问题的人也可能有兴趣知道我后来遇到了一个错误,该错误是在未按正确顺序调用 FlatBufferBuilder 函数时发生的。显然,Flatbuffers 对象的构建顺序很重要。我花了一段时间才找到那个——新手要小心。
c++ - 在调试(c ++ MSVC)中提高flatbuffer性能的任何方法
我正在尝试在我的公司中使用 flatbuffers 作为原始结构的替代品。我们需要序列化的类相当大,我注意到 flatbuffer 序列化的开销超过了我们在运行调试构建时所能承受的。
我用以下简单的测试程序复制了我的发现(数据类型类似于我们生产代码中的数据类型):
在我的电脑上调试大约需要 40 秒(发布时大约需要 400 毫秒)。我正在寻找任何方法来提高调试版本的性能。分析表明大部分时间都花在了 std::vector 代码上,所以我尝试将 _ITERATOR_DEBUG_LEVEL 设置为零,但这并没有带来任何显着的性能提升。
c# - 将旧缓冲区封装在新缓冲区中
所以我有这样的计划:
其中 table Sample 有多个字符串向量,并且它的实例非常大。我的文件系统上有很多带有示例实例的文件,这花了我一些时间来创建。现在我想随机取 2 个文件,将它们读入内存并创建一个封装它们的新请求。
我正在使用 c# 并且这条线有效:
但我似乎找不到在新的 Request 实例中引用它们的方法。我需要某种方式将这些缓冲区按原样添加到新构建器,然后将它们的偏移量传递给同一个构建器中的新请求。在新的构建器中重新构建它们不会有效。
我怎样才能做到这一点?