协议缓冲区特异性
Protocol Buffer Specificity
我最近开始集成 Google 的协议缓冲区,用于机器人网络中更复杂数据结构的通信(例如矩阵、内部状态数组、设备信息)。
虽然我仍处于原型设计阶段,但我已经开始考虑我应该为 long-term 支持制作多具体的原型消息。我看到三种可能的方法(非常简单的例子):
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(也称为数据包 header)来指定解析消息的方法。但是对于 protobufs,预先指定的 .proto 的整个概念似乎充当了一个 header 概念。
是否有推荐的消息特异性方法?编码标准?经验法则?
干杯,
我想这主要是个人喜好问题(让这个 Q 离题了。)
我会阅读并遵循 proto3 guide and style guide。
作为提示,我建议您指定用于区分特定收件人的邮件的字段和消息,以便更容易解析。
尽可能保留所有实体optional,然后您可以稍后更改格式,它仍然向后兼容。
Nested 消息也可能是一种替代方法,您可以创建如下层次结构:
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"];
}
}
我最近开始集成 Google 的协议缓冲区,用于机器人网络中更复杂数据结构的通信(例如矩阵、内部状态数组、设备信息)。
虽然我仍处于原型设计阶段,但我已经开始考虑我应该为 long-term 支持制作多具体的原型消息。我看到三种可能的方法(非常简单的例子):
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(也称为数据包 header)来指定解析消息的方法。但是对于 protobufs,预先指定的 .proto 的整个概念似乎充当了一个 header 概念。
是否有推荐的消息特异性方法?编码标准?经验法则?
干杯,
我想这主要是个人喜好问题(让这个 Q 离题了。)
我会阅读并遵循 proto3 guide and style guide。
作为提示,我建议您指定用于区分特定收件人的邮件的字段和消息,以便更容易解析。
尽可能保留所有实体optional,然后您可以稍后更改格式,它仍然向后兼容。
Nested 消息也可能是一种替代方法,您可以创建如下层次结构:
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"];
}
}