MsgPack编码/解码Array与Map的需要注意的问题(语言:Lua)

场景:
在我们游戏逻辑中,游戏数据均保存在Redis中,基本逻辑均在Redis内部使用Lua Script编写,并返回给外部程序相应数据。在数据传递过程中,使用了MsgPack数据格式传递比较复杂的数据结构。

功能:
统计玩家角色拥有各种装备数量

预想:
返回数据的格式,预想的是返回map,key:装备原型ID(number),value:拥有数量(number),将此map进行MsgPack编码后返回给外部程序。

问题:
在某些情况下,外部程序始终不能正确解码出返回的MsgPack格式数据。

分析结果:
由于我们静态数据中装备原型ID是从1开始,那么当玩家角色拥有装备的原型ID刚好是从1开始而有序的时候(Lua中均是table类型表示Array和Map,Array索引从1开始),MsgPack编码是就会把此种情况的数据当作是Array来编码,那么外部程序需要解码成Map就会不成功,除此之外的问题均无问题。

可选方案:

  • 装备原型ID不要从1开始
  • 返回的map的key不要是number类型,使用string类型,再由外部程序解码出来后转成需要的number类型(极不推荐)
  • 想办法换种传出数据的组合格式,让MsgPack编码时,不论何种情况均解析成Array或者Map

我的方案:固定以一个length为2的Array传出数据,元素类型:MsgPack格式的string。

  • 元素1:装备原型ID数组的MsgPack编码
  • 元素2:各具体数量数组的MsgPack编码