各种protobuf实现之间的差异

时间:2013-05-09 18:16:07

标签: protocol-buffers

每种实施的权衡,优缺点是什么?他们有什么不同吗?我想要实现的是将一个盒子的矢量存储到一个protobuf中。

Impl 1:

package foo;

message Boxes
{ 
  message Box 
  { required int32 w = 1;
    required int32 h = 2;
  }

  repeated Box boxes = 1; 
}

Impl 2:

package foo;

message Box 
{ required int32 w = 1;
  required int32 h = 2;
}

message Boxes 
{ repeated Box boxes = 1; 
}

Impl 3:将这些消息中的多条消息传输到同一个文件中。

package foo;

message Box 
{ required int32 w = 1;
  required int32 h = 2;
}

2 个答案:

答案 0 :(得分:6)

马克·格拉维尔的答案肯定是正确的,但他错过的一点是

  • 选项1& 2(重复选项)将立即序列化/反序列化所有框
  • 选项3(文件中的多条消息)将逐框序列化/反序列化。 如果使用java,则可以使用分隔文件(这将在消息开头添加Var-Int长度)。

大多数情况下,使用重复或多个消息无关紧要,但如果有数百万/百亿的盒子,则内存将成为选项1和2(重复)和选项3(多个消息)中的问题该文件)是最好的选择。

总结如下:

  • 如果有数百/数十亿的Box使用 - 选项3(文件中有多条消息)
  • 否则,请使用其中一个重复选项(1/2),因为它更简单并且在所有协议缓冲区版本中都受支持。

就个人而言,我希望看到“标准”多种邮件格式

答案 1 :(得分:5)

1& 2只改变声明类型的位置/方式。工作本身也是一样的。

3更有趣:在BoxBox之后,你不能Box,因为protobuf中的根对象没有被终止(到允许concat === merge)。如果您编写Box es,则在反序列化时,您将只有一个Box,其中包含已写入的最后wh。你需要添加一个长度前缀;你可以随心所欲地做到这一点,但是:如果你碰巧选择“varint” - 编码长度,你就接近repeated给你的东西 - 除了{{1}在每个“varint”长度之前,还包括一个字段标题(字段1,类型2 - 所以二进制1010 =十进制10)。

如果我是你,我只是简单地使用repeated。您选择的1/2中的哪一个取决于个人选择。