首页 > 解决方案 > 确定正确的 protobuf 类

问题描述

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

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

解决方案


Protocol Buffer 确实支持多个类定义。这样做的方法是在协议格式文件中声明所有类型的类。

在此示例中,我们声明了两个不同的类及其属性:

syntax = "proto2";

package tutorial;

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}

message House {
  repeated string owner = 1;
}

如果您想使用协议缓冲区作为标准通信协议,我猜您想发送其中一个类。请参阅官方文档,他们在这篇文章中解释了如何处理这种情况。

另一个好的模式是创建一个独特的消息(包装器),它包含公共属性和其中一个类:

message WrapperMessage {
    required int64 timestmap = 1;
    oneof data {
        Person person = 2;
        House house = 3;
    }   
}

然后在解码类之前,您可以通过调用来检查包装器持有哪种类型的类HasField

注意:Protocol Buffers 3 基于 FileDescriptorSetandAny属性为此目的实现了一个新特性。


推荐阅读