Google--ProtoBuf

ProtoBuf简介:

  ProtoBuf是一种用于数据存储结构化的方法,与语言和平台无关(现在有JavaC++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快),所以,也请各位权衡好来进行开发。

 

今天先写到这,在以后的工作中再慢慢补充。

posted @ 2012-10-23 23:59  codersu  阅读(322)  评论(0编辑  收藏  举报