协议缓冲区特异性

时间:2015-10-01 02:49:48

标签: python c++ serialization protocol-buffers messaging

我最近开始整合Google的协议缓冲区,用于在机器人网络中传输更复杂的数据结构(例如矩阵,内部状态数组,设备信息)。

虽然我还处于原型设计阶段,但我开始想知道我应该如何制作原型信息以获得长期支持。我看到了三种可能的方法(非常简单的例子):

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的整个概念似乎充当了标题概念。

是否有推荐的消息特异性方法?编码标准?经验法则?

干杯,

1 个答案:

答案 0 :(得分:0)

我想这主要是品味问题(使这个Q边界偏离主题。)

我会阅读并关注proto3 guidestyle 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"];
    }
}