笔记:关于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的情况。
- 笔记:关于protobuf协议传输repeated(即表/数组)类型数据出错问题。
- protobuf 使用 repeated 出错
- protobuf repeated类型的使用
- 修改 protobuf repeated类型数据结构
- protobuf repeated类型的使用
- protobuf repeated类型的使用
- protobuf repeated类型的使用
- protobuf repeated类型的使用
- protobuf repeated类型的使用
- protobuf repeated类型的使用
- 网络传输数据出错问题
- 关于int型整数按逆序存入数组中的问题(也即十进制数和其他类型数据的转换问题)
- WebSocket中关于使用ProtoBuf传输数据介绍js部分
- WebSocket中关于使用ProtoBuf传输数据介绍js部分
- protobuf协议的Required,Optional,Repeated限定修饰符
- protobuf(数据协议)
- 给Protobuf中的repeated类型变量添加子项
- ProtoBuf(protocol buffer) 网络传输协议
- Activity的生命周期和启动模式
- 最小生成树之普里姆算法
- Linux系统上安装VMware Workstation
- 苹果内存取证工具volafox
- c语言编程中%g是什么格式
- 笔记:关于protobuf协议传输repeated(即表/数组)类型数据出错问题。
- JAVA正则表达式 Pattern和Matcher
- try中return某值,而finally中修改了这个值
- Java排序算法之基数排序
- 解决“指定的服务已经标记为删除”问题,安装mysql的时候
- C#回调函数和闭包
- cocos2dx Android虚拟机调试问题
- HBase 1.2.4 部署
- thinkphp使用文件缓存的实例