我目前正在研究一种协议缓冲系统,用于传输高达6 Mb的大消息。我的担心是我误解了以下帖子(https://eli.thegreenplace.net/2011/08/02/length-prefix-framing-for-protocol-buffers)。我对那篇文章的想法是:
message GeometryInTime
{
uint32 vecLength = 1;
message Vector3d
{
optional double x = 1;
optional double y = 2;
optional double z = 3;
}
uint32 timeStampLength = 1;
message Timestamp
{
optional int64 seconds = 1;
optional uint32 nanos = 2;
}
}
以长度为前缀的系统的有效实现是否有效?它适用于重复的字段吗?该长度是序列化长度还是非序列化长度(我对此感到困惑)?这对部分邮件反序列化有效吗?
编辑:
message Vector3d
{
optional double x = 1;
optional double y = 2;
optional double z = 3;
}
message Timestamp
{
optional int64 seconds = 1;
optional uint32 nanos = 2;
}
message GeometryInTime
{
uint32 vecLength = 1;
optional Vector3d vector = 2;
uint32 timeStampLength = 3;
optional Timestamp timestamp = 4;
}
答案 0 :(得分:0)
嵌入式message
只是定义,而不是用法。现在GeometryInTime
仅包含长度。
就嵌入子消息而言:有两种格式:长度前缀和分组(开始/结束令牌,现在基本上不建议使用此选项)。使用带前缀的长度时,库将处理所有内容-长度将始终以“ varint”编码。
自定义长度前缀方法唯一适用的时间是针对根消息-作为帧协议的一部分。在这种情况下,库与它无关,因此对message
所做的任何更改都不会有任何不同:您需要处理帧数据(长度前缀等各种格式的文件) outside < / strong>。