c++ - 确定正确的 protobuf 类
问题描述
在我现有的 ZeroMQ 应用程序中,我正在尝试将我的有效负载更改为 google protobuf。在初始分析期间,我面临的问题是我将有多个原型类,它们也可以写入日志文件。现在在运行时如何确定收到了哪个原型。而且稍后如果我在这里阅读日志文件,我也会面临同样的问题。有什么解决办法吗?在 proto2 和 proto3 中
解决方案
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 基于 FileDescriptorSet
andAny
属性为此目的实现了一个新特性。
推荐阅读
- c++ - 如何修复导致应用程序崩溃的代码指令
- django - pymongo.errors.OperationFailure:过滤器中不支持的类型
- excel - 在 Excel 中使用 VBA 强制保存在目录中
- django - 跨 2 个 FK 到同一张表的相关对象的总和,有条件
- reactjs - React Reveal 不适用于数据数组
- clojure - 如何在不明确写下值的情况下创建大型嵌套向量?
- mongodb - 对于模型“post”的路径“_id”中的值“comments”,转换为 ObjectId 失败
- python - 使用 pandas 计算大于先前值的值
- angular - Angular 7 新的路由代码.. 旧的 Angular 路由代码不起作用
- c# - 在集合中添加另一个对象时,如何覆盖 ObservableCollection 中的对象