java - 带有占位符引用的平面缓冲区
问题描述
我正在使用 flatbuffers 对类似 AST 的数据结构进行建模。简化后,模式定义如下所示:
namespace schema;
union Statement {
SimpleStatement;
FunctionStatement;
}
table SimpleStatement {
text: string;
}
table FunctionStatement {
func: Function;
}
table Function {
text: string;
}
table Component {
body: [Statement];
}
table Program {
body: [Component];
}
root_type Program;
我想做的是将Component
s 序列化为字节数组并保持缓存。在序列化s 时Program
,我会将 s 反序列化Component
回它们的 flatbuffers 类并将它们添加到Program
构建器中。
仅此一项就可以很好地工作,但是现在Function
s 开始发挥作用。在构建 a 时,Component
我真的无法访问构建其子Function
对象所需的数据。要构建Component
并缓存它,我需要添加一个占位符,在将反序列化的内容包含到构建器中Function
之前,我将其替换为相应的正确偏移量。但如果可能的话,我不知道该怎么做。Component
Program
一种解决方法是真正保存一个(更像人类的)引用,如字符串或 int (ID),并构建一个映射以稍后查找对象。但这意味着额外的查找和大小的轻微增加。
解决方案
如果您只是需要将多个子缓冲区组合成一个最终缓冲区,则使用该nested_flatbuffer
属性是最有效的。
如果之后您仍然需要更改数据,您可能希望使用“对象 API”,目前有很多编程语言都可以使用,但遗憾的是还没有用于 Java。https://github.com/google/flatbuffers/issues/4769
如果做不到这一点,您可能会为函数提供某种形式的 id,以便可以查找以后可用的信息。
推荐阅读
- ruby-on-rails - 参数数量错误(给定 2,预期 1)
- azure - 如何找到我的 Microsoft Azure 媒体服务帐户名称?
- r - 如何在按下某个键之前暂停代码执行?
- wordpress - 在特定类别的帖子内容中查找和替换单词
- android - 以前有效的项目中的主题出现新错误
- javascript - 单击单选按钮更改范围输入值
- python - 同时在不同的 GPU 上训练多个 keras/tensorflow 模型
- php - 重新定义 Wordpress CMS 中的“小部件”功能
- c - FFmpeg:av_parser_parse2 做什么?
- gcc - 如何使用未定义的引用创建 .so 共享库 - gcc