笔记:关于protobuf协议传输repeated(即表/数组)类型数据出错问题。

来源:互联网 发布:身份证电子版制作软件 编辑:程序博客网 时间:2024/06/08 03:24

err 1:假设协议是这样定义的:

message protoMsg

{

repeated string content = 1;

}

我用lua这样定义数据:

local tab = {}

tab[1] = "content 1"

tab[2] = "content 2"

tab[3] = "content 3"

服务器数据包{content = tab}通过protoMsg协议发送到客户端,这样传输的数据是没有问题的。

但是如果这样定义数据:

local tab = {}

tab[1] = "content 1"

tab[3] = "content 3"

tab[4] = "content 4"

服务器数据包{content = tab}通过protoMsg协议发送到客户端,这样传输的数据会有问题,这时客户端接收到的数据包解析出来会发现这个content(即tab)的元素只有tab[1]的值“content 1”,而tab表内索引值2以后的数据都丢失了。

我猜想protobuf协议在打包key值为数字序列类型数组数据时,是通过数值型循环获取表元素的,for i = 1, #tab do table.insert(data, tab[i]) end 这种方法获取key值为数字类型数组tab元素如果其间某一个索引值元素为nil,则循环会中断跳出,tab内因为tab[2]元素没有赋值,默认值为nil,这样protobuf在协议打包时遍历到tab[2]数据为nil时便中断了tab表的后续索引元素检索工作,所以会出现数据丢失的问题。

所以,key值为数字类型数组数据传输要慎重考虑索引值问题。

err 2: protobuf协议在传输int32类型数据时,如果该类型数据值为0,lua测试过的结果是接收端获取的数据为nil。

举例:

message protoMsg

{

      optional int32 num = 1;

}

服务器数据包{num= 0}通过protoMsg协议发送到客户端,客户端解析出来的num值为nil,测试的环境当前为lua。

所以,lua环境,使用protobuf协议int32类型传输数据慎重考虑该值是否有为0的情况。


原创粉丝点击