首页 > 解决方案 > 带有占位符引用的平面缓冲区

问题描述

我正在使用 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;

我想做的是将Components 序列化为字节数组并保持缓存。在序列化s 时Program,我会将 s 反序列化Component回它们的 flatbuffers 类并将它们添加到Program构建器中。

仅此一项就可以很好地工作,但是现在Functions 开始发挥作用。在构建 a 时,Component我真的无法访问构建其子Function对象所需的数据。要构建Component并缓存它,我需要添加一个占位符,在将反序列化的内容包含到构建器中Function之前,我将其替换为相应的正确偏移量。但如果可能的话,我不知道该怎么做。ComponentProgram

一种解决方法是真正保存一个(更像人类的)引用,如字符串或 int (ID),并构建一个映射以稍后查找对象。但这意味着额外的查找和大小的轻微增加。

标签: javaflatbuffers

解决方案


如果您只是需要将多个子缓冲区组合成一个最终缓冲区,则使用该nested_flatbuffer属性是最有效的。

如果之后您仍然需要更改数据,您可能希望使用“对象 API”,目前有很多编程语言都可以使用,但遗憾的是还没有用于 Java。https://github.com/google/flatbuffers/issues/4769

如果做不到这一点,您可能会为函数提供某种形式的 id,以便可以查找以后可用的信息。


推荐阅读