c++ - 确定正确的 protobuf 类

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

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

最佳答案

Protocol Buffer 确实支持多个类定义。你这样做的方法是声明你在 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;
}

如果您正在提示使用 Protocol Buffer 作为您的标准通信协议(protocol),我猜您想要发送其中一个类。请参阅官方文档,他们在 post 中解释了如何处理这种情况。 .

另一个好的模式是创建一个包含公共(public)属性和其中一个类的唯一消息 (Wrapper):

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

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

注意:Protocol Buffers 3 基于 FileDescriptorSetAny 属性为此目的实现了一项新功能。

关于c++ - 确定正确的 protobuf 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55577612/

相关文章:

c++ - 为任意类型删除实现小缓冲区优化的简单方法(如在 std::function 中)。

c++ - boost shared_ptr 和 c++ 引用。这里到底出了什么问题?

c++ - 将成员元组传递给非成员结构而不在模板中指定它

Javascript protobuf 性能

stream - gRPC 流服务只能有一个参数的原因

c++ - 访问 boost::unordered_multimap 或结构时很少出现段错误

c++ - 如何创建 Qt 自定义基类

C++11 空列表 union 的初始化 - 是否保证初始化 union 的全长?

C++ 和调用栈——它可以用来获取行号吗?

c++ - 关于google protobuf动态链接错误