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

protobuf-c: How to pack nested messages

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

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

    message Baz {
        required Bar a = 1;
    }
}

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

Foo myfoo = FOO__INIT;
Foo__Bar mybar = FOO__BAR__INIT;
Foo__Baz mybaz = FOO__BAZ__INIT;
mybaz.a = &mybar;

然而,关于如何序列化我在这一点上卡住了 mybaz。为 Foo 生成的结构不包含我可以分配 mybaz 的任何条目。而且没有生成直接打包Baz的方法。

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

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

你的意思可能是这样的:

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

  message Baz {
    required Bar a = 1;
  }

  optional Baz baz = 1;
}

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