每种实施的权衡,优缺点是什么?他们有什么不同吗?我想要实现的是将一个盒子的矢量存储到一个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;
}
答案 0 :(得分:6)
大多数情况下,使用重复或多个消息无关紧要,但如果有数百万/百亿的盒子,则内存将成为选项1和2(重复)和选项3(多个消息)中的问题该文件)是最好的选择。
总结如下:
就个人而言,我希望看到“标准”多种邮件格式
答案 1 :(得分:5)
1& 2只改变声明类型的位置/方式。工作本身也是一样的。
3更有趣:在Box
后Box
之后,你不能只流Box
,因为protobuf中的根对象没有被终止(到允许concat === merge)。如果您仅编写Box
es,则在反序列化时,您将只有一个Box
,其中包含已写入的最后w
和h
。你需要添加一个长度前缀;你可以随心所欲地做到这一点,但是:如果你碰巧选择“varint” - 编码长度,你就接近repeated
给你的东西 - 除了{{1}在每个“varint”长度之前,还包括一个字段标题(字段1,类型2 - 所以二进制1010 =十进制10)。
如果我是你,我只是简单地使用repeated
。您选择的1/2中的哪一个取决于个人选择。