恒定大小的 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 忽略字节,但这将是一个相当复杂且效率较低的解决方案。
嗯,我有消息结构:
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 忽略字节,但这将是一个相当复杂且效率较低的解决方案。