协议缓冲区特异性
Protocol Buffer Specificity
我最近开始集成Google的Protocol Buffer,用于机器人网络中更复杂的数据结构(例如矩阵、内部状态数组、设备信息)的通信。
当我还在原型阶段的时候,我已经开始思考我应该如何使原型消息更具体以获得长期支持。我看到了三种可能的方法(非常简单的例子):
1)中等专用性:使消息特定于每种类型的机器人。例:
// RobotA.proto
optional int32 commandID
repeated double positionData //ex: this robot has many joints
// RobotB.proto
optional int32 commandID
optional int32 subCommandID //ex: this robot has subcommands
optional double positionData //ex: this robot has only one joint
2)低特异性:使信息非常一般化。例:
// GeneralRobotMessage.proto
optional int32 commandID //switch-case which other potential data is needed
optional int32 potentialIntData
repeated double potentialDoubleArray
optional string potentialStringData
optional bool potentialBoolData
3)高特异性:每种类型的消息都有一个protobuf。例:
// NAKMessage.proto
// ACKMessage.proto
// RobotAGetPosition.proto
根据过去的经验,我通常采用一种低特异性的方法,并使用命令id(又名数据包头)来指定解析消息的方法。但是对于protobufs,预先指定的。proto的整个概念似乎充当了头文件的概念。
是否有推荐的消息专用性方法?编码标准?经验法则?
欢呼,
我猜这主要是品味问题(使这个Q边缘偏离主题)
我会阅读并遵循proto3指南和风格指南。
作为提示,我建议指定字段和消息,用于区分特定收件人上的消息,以便解析变得更容易。
如果可能的话,也保持所有的实体是可选的,然后你可以改变格式,它仍然是向后兼容的。
嵌套消息也可以是另一种选择,您可以创建一个层次结构,如:
message Robot{
optional uint32 id = 1;
optional RobotTypeA robo_type_a = 2;
optional RobotTypeB robo_type_b = 3;
message RobotTypeA {
optional uint32 a = 1;
optional uint32 b = 2;
optional uint32 c = 3;
optional uint64 d = 4;
optional int32 command_id = 5;
optional string ip_address = 6 [default = "10.10.10.10"];
}
message RobotTypeB {
optional uint32 a = 1;
optional uint32 b = 2;
optional uint32 c = 3;
optional uint64 d = 4;
optional int32 command_id = 5;
optional string ip_address = 6 [default = "10.10.10.10"];
}
}
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 在 openGL 中多次绑定缓冲区
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 协议缓冲区特异性