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的情况。