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
对象。
我有一个看起来像这样的 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
对象。