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

因为 struct 结构中不能使用 string 类型,修改成  table 即可

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());
原文地址:https://www.cnblogs.com/davad/p/4901794.html