协议缓冲区的长度前缀帧示例

时间:2018-08-21 10:09:02

标签: serialization protocol-buffers

我目前正在研究一种协议缓冲系统,用于传输高达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;

}

1 个答案:

答案 0 :(得分:0)

嵌入式message只是定义,而不是用法。现在GeometryInTime仅包含长度

就嵌入子消息而言:有两种格式:长度前缀和分组(开始/结束令牌,现在基本上不建议使用此选项)。使用带前缀的长度时,库将处理所有内容-长度将始终以“ varint”编码。

自定义长度前缀方法唯一适用的时间是针对根消息-作为帧协议的一部分。在这种情况下,库与它无关,因此对message所做的任何更改都不会有任何不同:您需要处理帧数据(长度前缀等各种格式的文件) outside < / strong>。