对于常量大小的protobuf消息,什么是好的做法?

时间:2015-05-26 12:20:58

标签: c++ protocol-buffers

好吧,我有消息结构:

message SomeMessage
{

    enum MessageType
    {
        eRegisterQuery             = 1;
        eRegisterResponse          = 2;
        eConnectionControlQuery    = 3;
        eConnectionControlResponce = 4;
    }

    optional uint64                beginFlag        = 1;
    required uint32                type             = 2;

    oneof messages
    {
        optional RegisterQuery         registerQuery    = 3;
        optional RegisterResponce      registerResponce = 4;
        optional Control               control          = 5;
    }

    repeated uint32                buffer           = 6;
    optional uint64                endFlag          = 7;
}

在序列化之后,我必须总是得到一个大小为1010字节的数据包。当然,我有超过4种消息类型,它们的大小不同。因此,每次必须序列化消息时,我必须插入“重复缓冲区”以获得最终大小。 我怎么能避免它?

1 个答案:

答案 0 :(得分:1)

您应该在protobuf的大小前加上前缀,然后在数据包的末尾添加零以使其达到1010字节。在接收端,您首先读取大小,然后使用例如解析消息。 ParseFromArray()传递该大小而不是完整的数据包大小。

您可以简单地将大小编码为两个字节,或者您可以使用半标准protobuf“分隔格式”,这通常用于流式传输多条消息,但也可以解决您的问题。你可以在这里找到它用C ++实现:

https://stackoverflow.com/a/22927149/2686899

也可以通过插入符合消息大小的伪字段来欺骗protobufs忽略字节,但这将是一个相当复杂且效率较低的解决方案。