谷歌协议缓冲区线类型开始组和结束组使用

use*_*919 2 c protocol-buffers protobuf-c

尝试解析来自服务器的消息,该消息将线路类型作为 Start Group 传递。我正在使用 protobuf-c lib,其中不支持起始组和结束组(最新)。是否有任何示例如何使用线类型作为起始组,以便我自己解析消息

提前致谢

Ken*_*rda 5

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

message Foo {
  repeated group bar = 1 {
    optional int32 baz = 2;
    optional string qux = 3;
  }
}
Run Code Online (Sandbox Code Playgroud)

从语义上讲,这几乎与以下内容完全相同:

message Foo {
  repeated Bar bar = 1;
  message Bar {
    optional int32 baz = 2;
    optional string qux = 3;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,编码略有不同(解释如下)。

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

我假设您已经阅读了编码文档,但它们没有解释组。

组以“开始组”标签开始,接着是子消息内容,接着是相应的“结束组”标签。这是 protobufs 中唯一一个标签出现在值末尾的情况——在所有其他情况下,一个标签只出现在开头。

相比之下,正常的子消息(如上面的第二个示例)使用“长度分隔”线类型进行编码:一个标签,后跟子消息大小,然后是内容。注意长度分隔的编码意味着你可以跳过一个子消息而不解析它的所有字段;对于组,了解组结束位置的唯一方法是解析每个字段,直到看到结束组标记。