为python-sproto添加map支持

时间:2022-10-16 04:57:45

上个月太忙了,做完这个修改还没写博客,现在补一下。。

之前使用protobuf做协议打包的时候,经常会有个痛点,没法用具体数据的值作为key来索引数据。比如现在客户端上传了造兵协议,协议大概长这样:

{
{
troop_type = ,
amount = ,
},
{
troop_tyoe = 10,
amount = ,
},
}

可以看到,造兵协议是一个数组,数组里每个元素是一个结构,包含troop_type(兵种类别)和amount(数量)。每次收到的时候,都需要遍历一次来建立一个以troop_type为key的字典,或者使用时根据troop_type来遍历查找。

sproto添加的这个支持,就是通过添加一点语法糖,让解出来的数据可以天然的以troop_type做key,解出来的数据就变成这样:

{
[] = {
troop_type = ,
amount = ,
},
[10] = {
troop_tyoe = ,
amount = ,
},
}

python绑定添加这个支持不难,但是会丧失一个错误检查的机会。当把一个Dict传给sproto的时候,如果这个域的定义是数组,将会报错退出。现在支持map后,将会兼容这种情况,直接取出Dict的value作为数组的内容。解包的时候,操作会稍微复杂一点,因为解包出来的域,根据协议应该是一个List,但是mainindex会提示需要将这个域变成一个Dict。

最后,还添加了一点异常处理,若解包过程中出错,会把解出来的这个字典直接释放掉。有点担心异常处理的时候,会不会导致引用计数没有处理好,引起内存泄漏。以后有空再做一下内存泄漏分析~具体的修改可以参考:https://github.com/spin6lock/python-sproto.git