flatbuffers 使用问题记录

简介: flatbuffers 使用问题记录

1.  命名空间的问题



namespace 1.0.3 版本包含文件类型前面不需要加命名空间,但是1.1.0 中包含需要在类型前加命名空间


include必须放在namespace前面


例如:

include “aa.fbs”
namespace IM.test;
foo.fbc
namespace foo;
struct Foo { f: uint; }
bar.fbc
include "foo.fbc";
namespace bar;
struct Bar { foo: Foo; }
flatc -c bar.fbc will fail with bar.fbc:3:0: error: structs_ may contain only scalar or struct fields
修改方式:
struct Bar { foo: Foo; } ->  struct Bar { foo: foo.Foo; }  或者 将 struct 修改成 table
struct UserInfo{
        user_id:uint;
                    name:string
}
error: structs_ may contain only scalar or struct fields


2. struct 和 table的区别



http://www.coder4.com/archives/4386


基本类型:


8 bit: byte ubyte bool

16 bit: short ushort

32 bit: int uint float

64 bit: long ulong double


复杂类型:


数组 (用中括号表示 [type]). 不支持嵌套数组,可以用table实现

字符串 string, 支持 UTF-8 或者 7-bit ASCII. 对于其他编码可以用数组 [byte]或者[ubyte]表示。

Struct 只支持基本类型或者嵌套Struct

Table 类似Struct,但是可以支持任何类型。


3. roottype的问题及多个table的解决方式



https://github.com/google/flatbuffers/issues/65  


Why the need for a Root


1) a commit was pushed yesterday that adds GetRootAs functions for all tables, not just the root_type.


2) generally no. this is a strongly types system, meaning you need to know the kind of buffer you're dealing with. If you want to use this in a context where you want to have multiple different root types, you have these options:

a) make your root type a table that contains a union of all possible sub-roots.

b) prefix flatbuffers with your own file header

c) use flatbuffer's built-in file indentification feature, which hasn't been ported to Java yet. I'll get to that.


3) That's a bug, the 1 should actually read: Any.Monster. I'll fix that.


多个消息一个文件中,但是root_type 只能有一个,解决方式如下:

namespace TestApp;
union Msg {TestObj, Hello}
struct KV {
    key: ulong;
    value: double;
}
table TestObj {
    id:ulong;
    name:string;
    flag:ubyte = 0;
    list:[ulong];
    kv:KV;
}
table Hello {
    id:uint;
    name:string;
}
table RootMsg{
    any:Msg;
}
root_type RootMsg;


具体样例可以参见:https://github.com/DavadDi/study_example/tree/master/flatbuffers/multi_table


4. enum不生成name的前缀


flatc -c --no-prefix -b aa.fbs



5. 其他问题


enum的默认值只能从0开始


由于table中的字段全部为可选,因此所有返回指针的地方都必须判断是否为空指针

#define STR(ptr)  (ptr!=nullptr)?ptr->c_str():""
std::string = STR(user_info->user_name());


目录
相关文章
|
API 开发工具
Xilinx SDK获取代码运行时间
Xilinx SDK获取代码运行时间
|
Java Linux API
Flutter插件开发指南01: 通道Channel的编写与实现
Flutter插件是Flutter应用程序与原生平台之间的桥梁,使得Flutter应用程序可以与原生代码进行交互,从而扩展Flutter应用程序的功能和能力。Flutter插件通常包括Dart和原生代码(例如Java、Kotlin或Objective-C、Swift等),并可以通过Flutter插件框架来注册、管理和调用。
326 0
Flutter插件开发指南01: 通道Channel的编写与实现
|
存储 关系型数据库 MySQL
MySQL数据类型详解及实例应用
MySQL数据类型详解及实例应用
|
9月前
|
算法
基于RRT优化算法的机械臂路径规划和避障matlab仿真
本课题基于RRT优化算法实现机械臂路径规划与避障。通过MATLAB2022a进行仿真,先利用RRT算法计算避障路径,再将路径平滑处理,并转换为机械臂的关节角度序列,确保机械臂在复杂环境中无碰撞移动。系统原理包括随机生成树结构探索空间、直线扩展与障碍物检测等步骤,最终实现高效路径规划。
|
机器学习/深度学习 存储 缓存
【CVDEBUG-1】- 页面文件太小,无法完成操作怎么办
在执行深度学习任务时,尤其是YOLO训练过程中,可能会遇到“页面文件太小,无法完成操作”的错误。这通常是由于Windows内存分配不足导致的。解决方法包括清理C盘空间和调整虚拟内存大小。具体步骤为:1) 清理桌面、系统文件夹、回收站及浏览器缓存;2) 调整虚拟内存设置。操作后重启电脑即可解决问题。
899 0
|
人工智能
三战VS2019编译VTK7.1+Qt5.15.2
本文记录了作者在VS2019环境下编译VTK 7.1与Qt 5.15.2的历程,包括正确配置方法、遇到的编译错误以及解决过程。
243 5
|
存储 API 数据库
对象存储数据库
【5月更文挑战第14天】对象存储数据库
455 1
|
网络协议
Telnet协议详解
Telnet协议详解
|
Dart Java Android开发
Flutter插件开发:开发与使用的技术解析
【4月更文挑战第26天】本文详细介绍了Flutter插件开发,包括创建插件项目、编写原生代码(Android和iOS)、注册与使用插件。通过Flutter命令行工具生成插件,使用MethodChannel进行Dart与原生平台的通信。示例展示了如何获取设备信息并展示在Flutter应用中。文章还提到插件测试与发布,强调了兼容性与性能的重要性,指出Flutter插件是扩展应用功能的关键。
|
自然语言处理 Java 测试技术
序列化性能之巅:使用Fury替换Protobuf/Flatbuffers实现10倍加速
问题背景Protobuf/Flatbuffers是业界广泛使用的序列化库,服务于大量的业务场景。但随着业务场景的复杂化,Protobuf/Flatbuffers逐渐不能满足性能需求开始成为系统瓶颈,在这种情况下,用户不得不手写大量序列化逻辑来进行极致性能优化,但这带来了三个问题:大量字段手写序列化逻辑冗长易出错;手写重复序列化逻辑开发效率低下;难以处理发送端和接收端字段变更的前后兼容性问题;这里将
2439 0