FlatBuffers中引用机制具体如何运作?如何避免重编译时字符串重复?
FlatBuffers 重复字符串复用解决方案
这个问题和schema的配置无关,FlatBuffers的重复数据共享(字符串/表去重)是序列化阶段的可选优化,不属于schema的语义约束,你不需要对现有schema做任何修改。
你重新编译JSON出现字符串重复的原因是:官方flatc工具默认没有开启字符串去重优化,相同的字符串会被多次写入缓冲区。
你可以通过以下方式实现字符串复用:
- 如果你使用
flatc命令行工具把JSON编译为FlatBuffer,添加--shared-strings参数即可自动全局去重所有字符串,相同字符串仅会存储一次,所有引用指向同一个offset。参考命令:flatc --binary --shared-strings 你的schema文件.fbs 输入文件.json - 如果你是通过生成的代码API手动序列化:
不要对同一个字符串重复调用CreateString类方法,提前将字符串创建后的offset存储下来,所有需要引用该字符串的字段统一使用同一个offset赋值即可;部分语言的API还提供了CreateSharedString方法,会自动维护字符串池实现复用,你可以直接调用。
额外说明:如果需要复用table类型数据,
flatc默认不会自动做table去重,你需要手动先创建一次table实例,保存它的offset,所有引用的字段都复用这个offset即可。值类型(int、float、struct等)是内联存储的,不支持共享复用。
内容的提问来源于stack exchange,提问作者San
相关产品推荐
相关产品推荐

