Google--ProtoBuf
ProtoBuf简介:
ProtoBuf是一种用于数据存储结构化的方法,与语言和平台无关(现在有Java、C++或Python开发),说的通俗点,就是你的数据被ProtoBuf序列化成二进制文件,通过通信机制传输,接受到后ProtoBuf再将其反序列化成我们需要的数据。
有人疑问了,不是有XML了吗,还重复造轮子干嘛,非也非也,一般的开源项目,要么自己单干,要么几个人合伙群殴,但是ProtoBuf得后台相当强硬,那可是google,而且ProtoBuf在google久经沙场,可见其功力非凡。
相比较XML,ProtoBuf更小,更快,更简单。在分布式的开发中,有着很好的效果。
这是官方文档。
ProtoBuf使用:
假设要实现一个通讯系统(C++),其中的客户端需要发送许多信息给服务端,使用socket来通讯
描述如下
--------------------------------
时间:time(int)
id:userid(int)
事件:thing(int)
事件描述:desc(string)
--------------------------------
首先要写一个proto文件,在该文件中添加一个名为"test"的message结构,用来描述通讯协议中的结构化数据。该文件的内容大致如下:
message test { required int32 time = 1; required int32 userid = 2; required int32 thing= 3; //required表示字段不能为空,否则出异常 optional string desc = 4; //optional 表示字段是可选属性,默认为空或者0 }
具体规则参见官方文档
然后,下载安装包,按照README的提示操作。
然后编译test文件。
protoc --cpp_out=. test.proto
然后会生成相应的test头文件
然后类似下面这样序列化/反序列化:
--------------------------------
// 发送方 Test test; test.set_time(XXXX); test.set_userid(123); test.set_thing(100); test.set_desc("cool!"); string stest; stest.SerailzeToString(&stest); //序列化 // 然后调用某种socket的通讯库把序列化之后的字符串发送出去 // xxxx.send(stest,xxxx);
// 接收方 string stest; // 先通过网络通讯接收到数据,存放到某字符串stest
// xxxx.get(&stest,xxxx); Test test; if(test.ParseFromString(stest)) // 解析该字符串 { cout << "userid:" << stest.userid() << endl << "desc:" << stest.desc() << endl; } else { cerr << "error!" << endl; }
这样,就不必费劲的去写数据解析协议了,GOOGLE帮你做的很好了,以后进行网络编程,只要双方定义好proto,按照相应的规范发送接收就可以了。
ProtoBuf缺点:
什么东西都不是万能的,ProtoBuf也有相应的缺点,比如发布的较晚,不如XML使用的广泛,编译出来的文件可读性也比较差,还有一个问题,就是当发送的协议数据包超过1M后,反序列时间会变得稍慢(比xml快),所以,也请各位权衡好来进行开发。
今天先写到这,在以后的工作中再慢慢补充。