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 中,您需要选择使用打包标记。
问题是关于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 中,您需要选择使用打包标记。