RPC之protocolbuf框架

 
protobuf使用总结(c++和php版本)

一、protobuf的优点:

灵活(方便接口更新)、高效(效率经过google的优化,传输效率比普通的XML等高很多);易于使用;多语言支持;原生支持c++,java,python,第三方扩展支持更多语言,详见:http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns

二、protobuf的编译及使用:

c++版(官方版)下载源码编译出libprotoc.lib和libprotobuf.lib两个库,并添加到工程的lib include中对于visual studio环境,直接运行protobuf/vsprojects/protobuf.sln进行编译vs2010下编译protobuf存在编译不过的bug:protobuf error C2039: 'type' : is not a member of 'std::tr1::tuple_element'
原因在于runtime library版本错乱的问题,因为不是太大的问题,所以作者并没有及时发布这个问题的fixed版本,只好自己解决。
解决方法:将工程中的其他project全部unload,只编译libprotobuf和libprotoc两个project注意:根据你工程的编译属性,选择对应的lib库版本,例如debug对应的debug版本的protobuf lib库将生成的lib库添加到工程设置中,或者在相应的源码处添加:
#pragma  comment(lib,"libprotoc.lib")
#pragma  comment(lib,"libprotobuf.lib")下载protobuf源码编译器(用来将.proto文件生成对应的.h和.cc),这个源码编译器也可以自己从protobuf的源码中编译出,前提是protobuf.sln在你的编译环境中能够编译通过。运行protobuf/vsprojects/extract_includes.bat生成include文件,将这些文件加入到工程的头文件include中;设计编写.proto文件:具体可以参考官方的教程
 
需要注意的是:repeat关键词。该关键词的作用是表明关键词所修饰的数据结构会被多次重复传送,例如一个人有多个电话号码,那么在传输这个人的信息时,会传送多个类型为phone type的电话号码;这时,phone type就被声明为repeatPHP版(第三方扩展版)php版的protobuf是由kordulla编写的非官方版本,但被官方列为正规的第三方版本库,可以在这里下载到。

php版就不存在编译lib库的问题了,可以直接上马使用。
具体使用过程:将压缩包解压到apache对应的wwwroot目录的protobuf下;
将自己编写好的.proto文件(例如mysql.proto)放到protobuf/parser中;

这里注意:php版本不支持c++中的namespace,所以如果.proto文件中有package语句需要将其删除。建立一个myparser.php文件存放编译命令:
<?php
require_once('./pb_parser.php');
$parser = new PBParser();
$parser->parse('./mysql.proto');
echo ‘parse successfully!’;
?>
在浏览器中运行myparser.php进行源码生成;将生成的pb_proto_mysql.php复制到你的工程目录中即可;

pb_proto_mysql.php的使用方法和c++版的类似,具体可以参见php版的protobuf/example/test.php
有时候需要自己去看看pb_proto_mysql.php的源码从而获取准确的接口接口的更新:对于采用protobuf的工程来说,传输数据结构的更新非常简单,只需要修改对应的.proto文件,并重新生成对应的c++和php源文件即可。
这里要注意的是:
用.proto生成的源文件尽可能不要去修改,如果想进行扩展,那么请继承生成的类,这样的好处是将来更新接口的时候,可以直接替换掉对应的源文件而不需要人工去比较更新。

相关推荐