关于Protobuf
protobuf是google的一个开源序列化框架,基于二进制数据交换格式,兼顾了效率和灵活性。详见http://code.google.com/p/protobuf/。
本文假定读者对protobuf已经有了初步接触,故略过一些基本和细节的描述,着重于介绍protobuf在笔者项目中的应用思路。因项目主要编程语言是c++,所以本文的示例着眼于如何在c++中借助protobuf简化一些通用模块的处理。对于其它语言(java,python等),如果语言本身没有更好用的特性或者更方便的库的话,也可采取类似做法。
不仅仅是网络消息序列化
虽然protobuf最广泛的应用是网络数据交换,但在使用过程中发现其框架本身的设计具有极灵活的扩展性,对于服务器来说,完全可以作为通用的数据解析层。一言以蔽之,即可以将各种形式的外部数据以非常易用的方式存取,通过最自然的本地语言对象进行操作(在本文中是c++)。借助protobuf框架的以下特性,构建protobuf生态圈将会是一个轻松愉快的过程:
1.代码生成器
protobuf提供了自定义代码生成器的支持——“代码生成器”远没有它听起来那么复杂,相反,得益于protobuf合理的架构设计,笔者项目中的各类生成器一般只有几百行代码。
protobuf的代码生成器可以跟静态语言的编译器进行类比,编译器:
源码 ---> (编译器前端) ---> 中间代码 ---> (编译器后端) ---> 机器码
而protobuf的代码生成过程如下: