table在消息传递、数据存储中的排序规则
(很重要!!!!不修改的话可能更新后数据会出错!!!一定要康!!!!!!)
简介:
针对table在消息传递和数据存储时存在的排序问题,下个版本会做优化。但是优化后的版本对数据本身的排序有要求,下面给大家讲一下规则,避免更新后数据出错。
一.在新版本中,table类型的数据作为参数进行传递时
1. 若存在key值为数字1的数据,则传递的table为原table中key值从数字1开始连续的部分,其余部分会被删除。
例子:被传递的table具有key值为数字1的数据
传递后的table:
这时table中key值不与数字1连续的t[5]及t[“Count”]会被删除。
2.若不存在key值为数字1 的数据,则传递的table会保留所有数据,但会把其中number类型的key值转化为string类型
例子:被传递的table不具有key值为数字1的数据
传递后的table:
可以看到例子中key值为int类型t[2],t[3],t[5]变成了string类型的”1”,”2”,”3”。
二.在先前的版本中,table类型的数据作为参数进行传递时,会把其中所有数据类型为int的key值转化成string类型。
例子:
建立表a,且表a前两个key值的数据类型为int。
打印表a,可以看到表a前两个key值的数据类型没有变化,依旧是int。
当表a进行消息传递/数据存储后,再输出表a,这时前两个key值的数据类型由int变成了string。
三.建议
1. 在使用table存储数据时,为了避免数据的丢失
(1)若想使用数值类型的key值,建议使用table.insert函数向表中依次添加数据。因为使用table.insert函数添加数据时,会默认以数值类型的1开始顺序赋予key值。
(2)避免使用数值类型的key值,使用string类型的数据来充当key值
2. 由于逻辑的更改,可能会导致某些玩家的数据丢失,若之前的代码中存在上述可能出现数据删除的用法,建议及时更改数据的存储方式,确保数据安全。
3. 大概率可能出现问题的地方:
(1)数据存储服务、数据存储、排名存储中存储table类型的数据
(2)使用自定义事件、事件对象传递table类型的参数时
四.针对key值转换的通用方法
转换table中key的类型(newType,0: 转成string,非 0:转成number)
function GameConstant.TableKeyType(table,newType) local newTable = {} if type(table) == "table" then if newType == 0 then for k,v in pairs(table) do newTable[tostring(k)] = v end else for k,v in pairs(table) do newTable[tonumber(k)] = v end end else print("参数不是表(Table)") return nil end return newTableend end
注:如果不调这个方法,不连续的数据就会被删除,接收不到
调用之后才能接受到连续的数据
请登录后评论~