pyrobuf的改进

问题(1)–字符串编码

protobuf的标准里面,所有的字符串都是标准的UTF-8模式。而python恰恰是一个经常性遇到字符串编码问题的语言。

但是pyrobuf里面,处理字符串的时候,当遇到字符串问题的时候,不会跑出错误,而会直接崩溃。

解决(1)

源码的模板中,可以选择在字符串decode的判断中,加入try-except,pass掉错误。

1
2
3
4
5
try:
self._ = unicode(memory[current_offset:current_offset + field_size], 'utf-8')
except:
self._ = u''
pass

当然,这种修改必须修改掉全部的decode判断。也有另外一种方式,就是简单地抛出错误。

1
cdef int _protobuf_deserialize(self, const unsigned char *memory, int size) except -1:

在cython中except -1,代表着会将抛出的错误转化为python里面的Exception,就可以被上层调用的代码捕捉,不至于直接退出程序。

问题(2)–字段缺少

通过源码阅读,可以发现实际上如果protobuf里面的字段我并不需要,那么精简proto定义,可以减少解析的字段,因而优化解析的性能。然而,pyrobuf却判断了传入的data的长度,和解析过的长度,然后抛出了错误,

解决(2)

因而,需要删除这部分判断。

1
2
if buf != length:
raise DecodeError("Truncated message: got %s expected %s" % (buf, size))

另辟溪路

google的protobuf库里面实际上已经有了protobufc,解析的效率实际上与pyrobuf差不多。如果单纯只是解析的话,可以直接使用google的原生库。当然,pyrobuf还提供了输出到json,dict的函数~~