在我现有的ZeroMQ应用程序中,正在玩以将我的有效负载更改为google protobuf。在初始分析问题期间,我面临的问题是我将有多个原型类,这些类也可以写入日志文件。现在在运行时如何确定接收到哪个原型。而且稍后,如果我在这里读取日志文件,也会遇到相同的问题。有什么解决办法吗?在proto2和proto3中
答案 0 :(得分:1)
协议缓冲区确实支持多个类定义。这样做的方法是声明Protocol Format文件中具有的所有类类型。
在此示例中,我们声明了两个不同的类及其属性:
syntax = "proto2";
package tutorial;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
message House {
repeated string owner = 1;
}
如果您想使用协议缓冲区作为标准通信协议,我想您想发送其中一个类。请参阅官方文档,他们在本post中解释如何处理这种情况。
另一个好的模式是创建一个包含通用属性和一个类的唯一消息(包装):
message WrapperMessage {
required int64 timestmap = 1;
oneof data {
Person person = 2;
House house = 3;
}
}
然后在解码该类之前,您可以通过调用HasField
来检查包装器所持有的类的类型。
注意:为此,协议缓冲区3基于FileDescriptorSet
和Any
属性实现了一项新功能。