7

在对相同类型的多个消息进行编码的情况下,这些流实现中的每一个的权衡、优点和缺点是什么?

它们有什么不同吗?我想要实现的是将box'es的向量存储到protobuf中。

实施例 1:

package foo;

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

  repeated Box boxes = 1; 
}

实施例 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;
}
4

2 回答 2

11

Marc Gravell 的回答当然是正确的,但他错过的一点是

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

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

总而言之:

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

就个人而言,我希望看到“标准”多消息格式

于 2013-05-10T07:26:27.863 回答
8

1 & 2 仅更改声明类型的位置/方式。作品本身将是相同的。

3 更有趣:您不能Box在 afterBox之后进行流式传输Box,因为 protobuf 中的根对象没有终止(以允许 concat === 合并)。如果你Boxes,当你反序列化时,你将有一个Box与最后一个wh被写入的完全相同的一个。您需要添加一个长度前缀;您可以任意执行此操作,但是:如果您碰巧选择“varint”编码长度,那么您将接近repeated给您的内容-除了repeated还包括字段标题(字段1,类型2-二进制1010 = 十进制 10) 在每个“varint”长度之前。

如果我是你,为了简单起见,我会使用repeated。您选择 1 / 2 中的哪一个取决于个人选择。

于 2013-05-09T20:35:49.620 回答