问题(1)–字符串编码
protobuf的标准里面,所有的字符串都是标准的UTF-8模式。而python恰恰是一个经常性遇到字符串编码问题的语言。
但是pyrobuf里面,处理字符串的时候,当遇到字符串问题的时候,不会跑出错误,而会直接崩溃。
解决(1)
源码的模板中,可以选择在字符串decode的判断中,加入try-except,pass掉错误。
1 | try: |
当然,这种修改必须修改掉全部的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
2if buf != length:
raise DecodeError("Truncated message: got %s expected %s" % (buf, size))
另辟溪路
google的protobuf库里面实际上已经有了protobufc,解析的效率实际上与pyrobuf差不多。如果单纯只是解析的话,可以直接使用google的原生库。当然,pyrobuf还提供了输出到json,dict的函数~~