我想以不大于 MAX_SIZE 字节的块发送序列化的 protobuf 对象。
如果我多次调用
SerializeToArray(buff, MAX_SIZE)
,它会每次都继续序列化前 MAX_SIZE 字节,还是会真正执行我所期望的操作(最多将整个对象序列化为连续的 MAX_SIZE 字节块)?
从我做的几个实验来看,看起来是前者。如果确实如此,有没有办法实现我想要的,而不必首先将整个对象序列化到临时数组中,然后从该数组中最多以 MAX_SIZE 字节的块检索数据?
注意:我使用 C/C++ 工作,但我相信这不会影响答案。
为此,您需要自己进行分块。
有两种方法:
选项 1 变得很繁琐。
选项 2 就像在发送者和接收者之间的协议中引入较低层。简单的消息可能类似于:
message Chunk
{
int32 messageNum = 1;
int32 chunkNum = 2;
int32 totalChunks = 3;
bytes chunkData = 4;
}
您限制
chunkData
的大小,以便在序列化 Chunk
时获得少于 MAX_SIZE
字节。您可以将原始消息序列化为数组,然后迭代生成 Chunks
并发送它们。接收者将从 chunkData
重新构建数组,完成后将调用 ParseFromArray()
来反序列化原始消息
您可能需要使用 messageNum 来识别块是针对哪一条原始消息的。例如,如果发送方和接收方之间的通道不“完美”,并且接收方可能会在中途开始接收
Chunks
; messageNum
允许接收者发现正在发生的事情。