假设一个Protobuf消息体的结构如下:
//请求玩家列表
message MsgGetPlayerList {
int32 type = 1;
}
如果其“type = 0”, 那么该条Msg序列化之后的ByteSizeLong = 0;
如果其“type = 10”, 那么该条Msg序列化之后的ByteSizeLong = 2;
如果其“type = 100000000”, 那么该条Msg序列化之后的ByteSizeLong = 6;
由此可见,Protobuf对消息体做了很大的优化,如果消息体内全部都是默认值的话,比如int32的默认值为0, 就算你有10个变量,但是全部都是默认值,它序列化之后的长度依然为0.
或者越界后,它会自动增加长度,防止数据传输的错误。
这个问题告诉我们,在解析Protobuf消息体结构时候,遇到0长度的也应该进行解析,否则有可能会丢失消息。