protobuf 中是否有替代 flatbuffers 结构的方法?

Is there alternative to flatbuffers struct in protobuf?

问题是关于protobuf的,但首先我想解释一下flatbuffers的类似概念:

我知道在 flatbuffers 中我可以用这样的标量类型创建 Point2d 结构:

struct Point2d {
  x: double;
  y: double;
}

table PointCloud {
  point_array: [Point2d] (required);
}

此处的结构牺牲了模式演化,我可以接受这一点,但在 return 中,我可以拥有具有数百万个元素的此类点数组,开销几乎为 0,每个点结构(即 16 bytes-long)会依次写入buffer,所以2点占32字节,4点占64字节等

我是 protobuf 世界的新手,但似乎 protobuf ALWAYS 将带有字段 ID 的 varint 写入输出流,即使重复“消息”并包含标量类型也是如此.因此,对于每个重复的 point2d(16 字节),我们有 2 个额外的 varint 字节,这在“数组”中是完全无用的。

我说得对吗?它是否会在 point_array 中每个重复点的每个 x 和 y 字段之前实际写入 varint 字节?在 protobuf 中是否有替代 flatbuffer struct 的方法?

更具体地说,我包含了类似于 flatbuffer 文件的原型:

message Point2d {
  double x = 1;
  double y = 2;
}

message PointCloud {
  // Is protobuf serializing 2 varints with each Point2d in this repeated field?
  repeated Point2d point_array = 1;
}

在protobuf中,你无法避免结构化数据中的字段头,但是:如果你使用非结构化的简单数组,它可以被“打包”(这只是意味着:没有字段头)。当使用诸如 int32 之类的“重复”原语时,这在 proto3 中是自动的。在 proto2 中,您需要选择使用打包标记。