恒定大小的 protobuf 消息的良好做法是什么?

What is good practice for protobuf message of constant size?

嗯,我有消息结构:

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 种消息类型,它们的大小也不同。所以每次我必须序列化一条消息时,我都必须插入 "repeated buffer" 以获得最终大小。 我怎样才能避免它?

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

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

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