为python-sproto添加map支持
上个月太忙了,做完这个修改还没写博客,现在补一下。。
之前使用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
为python-sproto添加map支持的更多相关文章
- python sproto支持64位有符号整数
小伙伴需要64位整数做物品的id,之前python sproto的判断有问题,写篇日志记录一下. 之前有问题的代码是这样的: if (!PyInt_Check(data)) { PyErr_SetOb ...
- Spring Boot 添加Shiro支持
前言: Shiro是一个权限.会话管理的开源Java安全框架:Spring Boot集成Shiro后可以方便的使用Session: 工程概述: (工程结构图) 一.建立Spring Boot工程 参照 ...
- IIS 添加mime 支持 apk,exe,.woff,IIS MIME设置 ,Android apk下载的MIME 设置 苹果ISO .ipa下载mime 设置
原文:IIS 添加mime 支持 apk,exe,.woff,IIS MIME设置 ,Android apk下载的MIME 设置 苹果ISO .ipa下载mime 设置 站点--右键属性--http头 ...
- CEF3编译添加mp4支持(对应CefSharp63.0.3),chromium63(3239),附release下载
编译环境需求(3239版本) win7或更高,64位 vs2017 15.3.2+ 默认位置安装 不需要安装附带的win10sdk,sdk单独装 Windows 10.0.15063.468 SDK ...
- Spring Boot 添加JSP支持【转】
Spring Boot 添加JSP支持 大体步骤: (1) 创建Maven web project: (2) 在pom.xml文件添加依赖: (3) ...
- 实现python中的map函数
假设Python没有提供map()函数,自行编写my_map()函数实现与map()相同的功能.以下代码在Python 2.7.8中实现. 实现代码: def my_map(fun,num): i = ...
- 把自己Github上的代码添加Cocoapods支持
转载请注明原链接:http://www.cnblogs.com/zhanggui/p/6003481.html 一.前言 这两天被cocoapods折磨的心力憔悴.看cocoapods官网的添加支持, ...
- 在IntelliJ IDEA中添加框架支持时找不到Hibernate的解决办法
问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找 ...
- 别再为了iOS新系统设备而重新安装一个新版Xcode了.其实我们可以添加版本支持
众所周知,Xcode7.3的代码补全是有问题的 如导入自定义类之后,在代码中并不会补全相应的类名... 但Xcode7.2是没有这个问题的,但很多时候我们自己的设备都升级到了iOS9.3.X系统,导 ...
随机推荐
- 配置eclipse使能打开当前文件所在目录
配置方法如下:Run -> External Tools -> External Tools Configurations...右键Program,new 在右边的界面中: Locatio ...
- wifipineapple使用教程
1.把开关拨到右边 如果有灯亮说明有电 4个灯全亮说明电量是满的 以此类推 如果一个也不亮说明没电了需要用充电器充电 2.把开关拨到左边打开wifi的开关 会开启一个wifi大概一分钟左右会有wif ...
- Hibernate各种主键生成策略与配置详解
出自:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前 ...
- Uiautomator ——API详解
版权声明:本文出自carter_dream的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4921701.html 简单的例子 以一个简 ...
- iOS开发 利用Reachability判断网络环境
导入头文件:#import "Reachability.h" 然后将 SystemConfiguration.framework 添加进工程: 1.检查当前的网络状态(wifi.W ...
- android通知栏Notification点击,取消,清除响应事件
主要是检测android通知栏的三种状态的响应事件 这次在实现推送需求的时候,要用到android通知栏Notification点击后进入消息页面,因为要实现一个保存推送用户名字的功能,我在点击后处理 ...
- python + selenium相关事件和元素定位
女友由于工作上的失误,将公司RDM中的某一字段的2000条数据给删除了.....就算是重新添加字段,但是与其他数据的关联性已经不在了.由于每天的数据修改量大,有关部门不愿意恢复数据库,因此只能一条条的 ...
- golang获取数据表转换为json通用方法
package main import ( "database/sql" "fmt" "log" "net/http" ...
- 在centos6.5中安装scp和lrzsz
简介 scp用于在两台centos中传输文件用的,lrzsz用于在xshell上传输本地文件到远程centos服务器上用的 1.安装scp [root@localhost ~]# scp -ba ...
- linux -- 基于mysql tomcat 部署web项目
一.导入数据库 二.配置web项目访问端口 vim /var/lib/tomcat8/conf/server.xml <Connector port=" protocol=" ...