2015-11-19 23 views

回答

4

对于背景,“组”是表示子消息的不同方式。他们声明如下:

message Foo { 
    repeated group bar = 1 { 
    optional int32 baz = 2; 
    optional string qux = 3; 
    } 
} 

语义上说,这是几乎完全一样:

message Foo { 
    repeated Bar bar = 1; 
    message Bar { 
    optional int32 baz = 2; 
    optional string qux = 3; 
    } 
} 

然而,编码略有不同(如下所述)。

在Protobuf首次开源时,组已被弃用,因此很多非Google实现不支持组。 Google有一些仍然使用群组的非常古老的协议,但Google之外可能没有人应该使用群组,所以我猜你正在使用的协议是Google的协议之一。 (如果没有,也许你只是有损坏的数据。)

我假设你已经读了the encoding docs,但他们不解释组。

组以“起始组”标签开始,随后是子消息内容,后跟相应的“结束组”标签。这是标签出现在值结尾的protobufs中的唯一情况 - 在所有其他情况下,标签只出现在开始处。相反,正常的子消息(如上面第二个例子中所示)使用“长度定界的”导线类型进行编码:标签,后跟子消息大小,后面是内容。请注意,长度分隔的编码意味着您可以在不解析所有字段的情况下跳过子消息;通过一个群组,知道群组结束的唯一方法是解析每个字段,直到看到群组标记。

+0

感谢您的信息,这可以帮助我很多。 – user3232919