protobuf-c:如何打包嵌套消息

dar*_*nir 4 c protocol-buffers

我有一个 Protobuf 协议文件,看起来像这样:

message Foo {
    message Bar {
        required string name = 1;
        required string value = 2;
    }

    message Baz {
        required Bar a = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于此协议文件,我需要使用 protobuf-c(Protobuf 的 C 扩展)编写编码器。我写了以下代码:

Foo myfoo = FOO__INIT;
Foo__Bar mybar = FOO__BAR__INIT;
Foo__Baz mybaz = FOO__BAZ__INIT;
mybaz.a = &mybar;
Run Code Online (Sandbox Code Playgroud)

但是,我在这一点上被困在如何序列化mybaz. 为 Foo 生成的结构不包含我可以分配mybaz给的任何条目。并且没有生成直接打包Baz的方法。

在 Python 中,这要简单得多,因为mybaz.SerializeToString()已经生成了一个函数。我应该如何在 C 中解决这个问题?

Ken*_*rda 7

在 Protocol Buffers 中声明嵌套类型就像在 C++ 中声明嵌套类或static在 Java 中声明内部类。这只是声明了一个新类型;它不会向外部类型添加字段。所以,在你的原型模式中,Foo是一个完全空的消息——它没有字段。无论您使用哪种编程语言,这都是正确的。

可能你的意思是这样的:

message Foo {
  message Bar {
    required string name = 1;
    required string value = 2;
  }

  message Baz {
    required Bar a = 1;
  }

  optional Baz baz = 1;
}
Run Code Online (Sandbox Code Playgroud)

现在Foo有一个调用的字段baz,您可以在其中分配一个Baz对象。