【问题标题】:flatbuffers with placeholder references带有占位符引用的平面缓冲区
【发布时间】:2020-06-25 15:33:18
【问题描述】:

我正在使用平面缓冲区来建模类似 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 序列化为字节数组并保持缓存。在序列化Program 时,我会将Components 反序列化回它们的flatbuffers 类并将它们添加到Program 构建器中。

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

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

【问题讨论】:

    标签: java flatbuffers


    【解决方案1】:

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

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

    否则,您可能会为函数提供某种形式的 id,以便可以查找以后可用的信息。

    【讨论】:

    • 谢谢,nested_flatbuffer 非常有趣,在许多情况下肯定很有用。不幸的是,我需要多层嵌套,但只有一个地方可以组合。我采用了“给他们某种 ID”的方法,实际上我创建了嵌套表,但只填充了最少的表。编写最终缓冲区意味着重建Components 的一些额外工作,但它解决了许多其他值得的问题。
    • 你可以嵌套任意深:)
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多