【问题标题】:Protocol Buffer Specificity协议缓冲区特异性
【发布时间】:2015-10-01 02:49:48
【问题描述】:

我最近开始集成 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(也称为数据包标头)来指定解析消息的方法。但是对于 protobuf,预先指定的 .proto 的整个概念似乎充当了标头概念。

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

干杯,

【问题讨论】:

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


    【解决方案1】:

    我想这主要是一个品味问题(让这个 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"];
        }
    }
    

    【讨论】:

    • 我其实很喜欢嵌套消息的概念,它可以很好地混合特殊性。是的,可选是要走的路(我假设您也认可重复的字段,因为它们也是可选的)。
    • 当然repeated字段很有用,只要记住将[packed=true]指定为optimize encoding即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2021-12-19
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2014-03-18
    相关资源
    最近更新 更多