1.概述。
protobuf,作为网络通信时的消息载体,不仅效率高,而且还加快开发进度,减少BUG。
但是protobuf消息生成的类,不管是C++\Java还是其他第三方支持的语言C#等生成的消息类,都不太适合用于业务逻辑处理(没有100%的不行,如果非要使用message类作为业务逻辑对象,那么耦合性就太高了,当然类似于C#这种提供partial类的功能是没有问题的)。因此很多时候,我们都需要重复定义至少一份业务逻辑对象,至少是客户端和服务器各一份。那么就涉及到这么业务逻辑对象和protobuf message之间的互相复制的问题。
2.能自动化吗
业务逻辑对象和protobuf message之间是消息是如此的相识,甚至趋向于相同。因此有理由相信,可以根据业务对象自动创建proto message,或者根据proto message文件自动创建业务对象。并且自动生成业务对象和proto之间的赋值方法(toMessage和fromMessage),
toMessage方法把业务逻辑对象的当前值copy到对应的protobuf消息对象。
fromMessage方法把proto消息的但前值copy到业务逻辑对象。
本人的目的,就是解放劳动力,让我们使用更多的时间关注与业务,而不是那些繁琐容易出错的编解码。。。
3.基础数据类型映射
protobuf支持的基础数据类型是C++、Java、C#语言等的一个子集。基本上大多数基础类型都有直接对应的数据。除了char\short类型以外(proto没有char\short类型)。
bool\int\long\unsigned int\unsigned long\enum都可以映射到protobuf的数据类型。
至于char、short,可以直接映射到int。
对于string,如果有中文需求,映射到bytes,如果没有映射到string即可。在这里统一映射到btyes。
4. 简单复合类型(POD复合类型)
此类型的类需呀复合一下规则之一:
a.可包含基础数据类型,包含string和enum
b. 包含另外一个POD类
c.如果包含STL 容器,则容器的内容必须复合 a,b规则.
简单复合类型,可以很容易的一一映射到protobu消息。并且编解码的时候,可以直接赋值即可。
5. 复杂复合类型
指该类型所包含的成员,不仅具有简单类型的a、b、c以为,还可以包含指针(引用对象)。对于指针数据成员,在从protobuf消息转换到业务对象的时候,不能简单的创建一个对象,让后赋值,因为对象可能已经存在。只需要调用系统相关的查询方法即可获得。。
6.关于指针
只支持shared_ptr\weak_ptr,不支持原始指针
可以嵌套在STL容器中。
除非在容器中,否则映射为optional字段。
7.关于map
protobuf不支持map,这点没有thirft牛叉。因此对于map,映射为2个字段 xx_key,和xx_value
8.关于容器的冗余
对于STL容器,会增加一个字段optional bool include_xx,用于避免repeated字段的二义性。repetaed大小为0的时候,是告诉对象删除全部,还是保留不变呢?无法决定,因此通过include_xx字段组合来取消repeated字段的二义性. 如果include_xx == false,则不管reptead的内容如何,保留不变,也就是接收端忽略reptead字段。如果为true,并且repeated字段的大小为0,则删除全部。
9. 关于继承
很多编程语言都支持继承,C++、Java、C#都支持,但是protobuf不支持。在C语言的struct中,处理继承一般是在结构的第一个成员设置为基类。protobuf message借鉴次惯用手法,如果一个类,有基类,那么他生成的message的第一个字段编号为1,是起基类。并且名称固定为base。
对于多继承,过于复杂,暂不支持,何况在Java、C#中并不支持多继承。因此目前没实现。
10.工程:
代码已经共享到osc@git ,使用scala编写。
http://git.oschina.net/newzai/BNFParser
11.实践:
http://git.oschina.net/newzai/SNMP
一个网管项目,服务器NOS使用C++实现,客户端NOSC使用C# WPF实现。本人自编写了DataMoel.h,定义了业务逻辑对象(比较简单,就3-4个类),autogen目录下的代码都是自动生成。
12.补充
http://blog.csdn.net/love_newzai/article/details/9013183
http://blog.csdn.net/love_newzai/article/details/6929430
13. 配合 wireshark-protobuf 插件,开发调试无障碍,无需在代码中不停的打印log,抓包就是最好的log。。
发表评论
要发表评论,您必须先登录。