一个简单的protobuf兼容库
更新日期:
上篇博文已经提到了,protocol buffer虽然简单好用,但是你必须把他的库文件整个加载到你的项目中,虽然大部分时候你只是想用他的编码和解码部分,编译他有时候也不是件容易事,如果能简单的引用他生成的消息文件就在项目中使用就好了(不需要引入protocol buffer库)。
因此自己写了一个简单的protocol buffer的编码和解码文件,在使用时直接引用这一个头文件就可以了,省去了protocol buffer“庞大”库的引入。
其实上篇博文已经讲了protocol buffer的编码方式,从其中也不难推导出他的解码方式,所以这里就不再介绍他的解码方式了。有了protocol buffer的编码解码方式就很容易对相应数据进行编解码了。
具体编解码见文件gpbencode.h
1.gpbencoder实现protocol buffer编码,大体这样1
2template<typename Type>
INL static uint8* WriteDataToArray(field_number, Type value, output)
2.gpbdecoder实现protocol buffer解码,大体这样1
2template <typename CType>
inline static bool ReadPrimitive(io::CodedInputStream* input, CType* value)
3.WireFormatLite是protocol buffer中存在的类,它主要抽象出了protocol buffer中各个类型的编码解码,该实现也基本与protocol buffer源码一直,以便后面如果protocol buffer更新了可以跟着更新,具体的也可以查阅protocol buffer源码。
4.CodedInputStream CodedOutputStream这两个类也是protocol buffer中存在的,他们主要实现了基础数据的底层编码解码,这里的基本也是从protocol buffer中搬过来的。
为了兼容protocol buffer的实现方式,我也实现了一个把.proto生成.h的类,该类生成的文件完全依赖于上面的gpbencoder gpbdecoder,所以在使用的使用只需要引用gpbencode.h即可,抛弃了对protocol buffer的依赖。
具体实现见gpb_generator.cpp
它本身是依赖于protocol buffer库的,但生成的文件不依赖protocol buffer。