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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值