我正在开发一款处理硬件设备控制和状态信息的系统控制软件。为简单起见,我使用单个、中等复杂的协议缓冲区结构在线程之间进行通信。我还在网络接口上采用了相同的结构,以便外部客户端可以控制和监视系统的所有部分。
该软件可能使用低比特率数据链路运行,因此我正在寻找减少网络负载的方法。因此我的问题是:
如果不为每个 I/O 操作解析整个 protobuf 结构,有没有办法过滤(修剪)protobuf 以在运行时删除某些消息?
例如,如果我有这个.proto
:
message Status {
optional BusyMsg busy = 10;
optional FaultMsg system_fault = 11;
optional VoltageMsg rail_volts = 3000;
optional InternalStatus internal = 4000;
}
message InternalStatus {
optional PressureMsg head_pressure = 1;
optional TempMgs cabinet_temp = 2;
}
是否有一种简单的方法来删除(或抑制传输)rail_volts
或internal
,可能通过测试大 ID 号(在这种情况下为 3000 和 4000)?或者是否可以很好地使用可以提供帮助的扩展和属性?
我知道对于我不想序列化的所有字段,我可以在 I/O 边界调用 Clear()。但我宁愿以某种方式标记它们,.proto
而不是依赖网络接口上的 C++ 代码来保持更新。(internal
到目前为止,小节是我最好的主意。我可以剪掉下面的所有内容。)
我不是在寻找一种彻底的结构解决方案。我想知道我是否缺少 API 的一个优雅特性。