我可以将 protobuf 对象序列化为多个块吗?

问题描述 投票:0回答:1

我想以不大于 MAX_SIZE 字节的块发送序列化的 protobuf 对象。

如果我多次调用

SerializeToArray(buff, MAX_SIZE)
,它会每次都继续序列化前 MAX_SIZE 字节,还是会真正执行我所期望的操作(最多将整个对象序列化为连续的 MAX_SIZE 字节块)?

从我做的几个实验来看,看起来是前者。如果确实如此,有没有办法实现我想要的,而不必首先将整个对象序列化到临时数组中,然后从该数组中最多以 MAX_SIZE 字节的块检索数据?

注意:我使用 C/C++ 工作,但我相信这不会影响答案。

serialization protocol-buffers
1个回答
0
投票

为此,您需要自己进行分块。

有两种方法:

  1. 将原始消息的结构分解为更小的消息的集合,这样当每个消息被序列化时,线路数据就足够小
  2. 将原始消息序列化为一个足够大的数组以包含整个消息,然后将该数组分解为单独的块,也许在一个简单的 GPB 消息中发送每个块,该消息包含 1 个块以及一系列块序列中行踪的描述适合。

选项 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
允许接收者发现正在发生的事情。

© www.soinside.com 2019 - 2024. All rights reserved.