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());