好吧,我有消息结构:
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种消息类型,它们的大小不同。因此,每次必须序列化消息时,我必须插入“重复缓冲区”以获得最终大小。 我怎么能避免它?
答案 0 :(得分:1)
您应该在protobuf的大小前加上前缀,然后在数据包的末尾添加零以使其达到1010字节。在接收端,您首先读取大小,然后使用例如解析消息。 ParseFromArray()
传递该大小而不是完整的数据包大小。
您可以简单地将大小编码为两个字节,或者您可以使用半标准protobuf“分隔格式”,这通常用于流式传输多条消息,但也可以解决您的问题。你可以在这里找到它用C ++实现:
https://stackoverflow.com/a/22927149/2686899
也可以通过插入符合消息大小的伪字段来欺骗protobufs忽略字节,但这将是一个相当复杂且效率较低的解决方案。