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


目录
相关文章
|
6月前
|
存储 SQL 数据挖掘
【源码解析】使用 Pandas 优化数据存储:深入解析 Block 合并机制
【源码解析】使用 Pandas 优化数据存储:深入解析 Block 合并机制
|
7月前
|
存储 JSON C#
【Unity 3D】C#从JSON文件中读取、解析、保存数据(附源码)
【Unity 3D】C#从JSON文件中读取、解析、保存数据(附源码)
264 0
|
存储 XML JSON
【100天精通python】Day26:文件和IO操作_文件指针的定位与移动,序列化与反序列化
【100天精通python】Day26:文件和IO操作_文件指针的定位与移动,序列化与反序列化
73 0
|
easyexcel
EasyExcel低版本中数据行中包含空数据会跳过导致数据对应不上的问题解析
EasyExcel低版本中数据行中包含空数据会跳过导致数据对应不上的问题解析
492 0
|
自然语言处理 Java 测试技术
序列化性能之巅:使用Fury替换Protobuf/Flatbuffers实现10倍加速
问题背景Protobuf/Flatbuffers是业界广泛使用的序列化库,服务于大量的业务场景。但随着业务场景的复杂化,Protobuf/Flatbuffers逐渐不能满足性能需求开始成为系统瓶颈,在这种情况下,用户不得不手写大量序列化逻辑来进行极致性能优化,但这带来了三个问题:大量字段手写序列化逻辑冗长易出错;手写重复序列化逻辑开发效率低下;难以处理发送端和接收端字段变更的前后兼容性问题;这里将
1872 0
|
数据格式
Seurat V2格式更新到 Seurat3以上更高版本的数据格式
本分分享了一种更新 Seurat V2格式更新到 Seurat3以上更高版本的数据格式的简单操作方法,以供参考
369 0
|
缓存 NoSQL Go
Golang:go-cache基于内存的键值存储缓存库
Golang:go-cache基于内存的键值存储缓存库
774 0
|
存储 关系型数据库 索引
myrocks记录格式分析
--- title: MySQL · myrocks · myrocks记录格式分析 author: 张远 --- # 概况 rocksdb作为KV存储引擎,那么myrocks记录最终会以kv的形式存储在rocksdb中。MySQL中的表一般由若干索引组成, 在innodb存储引擎中,每个索引对应一颗B树,而在rocksdb存储引擎中,索引对应于rocksdb中一段连续范围的数据。
3915 0
|
存储 安全 Android开发
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)
314 0
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)
|
存储 Android开发 数据格式
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(一)
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(一)
248 0
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(一)