确定正确的protobuf等级

时间:2019-04-08 16:13:23

标签: c++ c++11 protocol-buffers google-protocol-buffer

在我现有的ZeroMQ应用程序中,正在玩以将我的有效负载更改为google protobuf。在初始分析问题期间,我面临的问题是我将有多个原型类,这些类也可以写入日志文件。现在在运行时如何确定接收到哪个原型。而且稍后,如果我在这里读取日志文件,也会遇到相同的问题。有什么解决办法吗?在proto2和proto3中

1 个答案:

答案 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基于FileDescriptorSetAny属性实现了一项新功能。