天天看点

使用protobuff 进行网络序列化和反序列传输实例

   首先我认为这个文章的读者应该是已经知道protobuff 是什么东西 该怎么用,为什么用,也就是 what    how why。如果你真的不知道,可以先去搜索引擎上读几篇他的介绍,如果可以翻墙去谷歌上读读英文文章更好。了解完protobuff后下来我就来点干货,也就是protobuff在网络传输中序列化和反序列的使用。虽然是一个很简单的例子,但是希望你可以从中找到入门开始使用protobuff的灵感。那么我们开始吧。。。。。。 

直接上代码: 我这里是使用c++进行例子的编写,其实protobuff也支持java和python 原理雷同,这里就不写了

首先是msg.proto

package demo;

message msg
{
    required int32 msgtype=1;
    required string msginfo=2;
    required string msgfrom=3;
    optional string opt=4; //can select 
}
           

之后我们  protoc --cpp_out=. msg.proto

使用protoc 编译器生成对应的msg.pb.h和msg.pb.cc文件

下来我们就要编写自己的代码了:

protobuff_demo.cc文件

#include"msg.pb.h"
#include<iostream>
#include<string>
using namespace std;


int main(int argc,char *argv[])
{
    demo::msg writer;
    writer.set_msgtype(1);
    writer.set_msginfo("i am weeks");
    writer.set_msgfrom("127.0.0.1");

     //C++string序列化和序列化API   
   
    //客户端格式化信息
    string in_data;
    writer.SerializeToString(&in_data); 
    //下面用一个临时的string 表示在网络中进行传输的过程
    //真是的过程中你可以借助相应的网络框架对数据进行传输
    //客户端将数据放到网络上   
    string tmp=in_data;



    //服务端从网络上拿数据 
    string out_data=tmp;
    //服务端反格式化信息
    demo::msg reader;
    reader.ParseFromString(out_data);
    cout<<"msg_type: "<<reader.msgtype()<<endl;
    cout<<"msg_info: "<<reader.msginfo()<<endl;
    cout<<"msg_from: "<<reader.msgfrom()<<endl;

    return 0;
}
           

之后用g++将 msg.pb.cc文件 和protobuff_demo.cc文件生成一个可执行文件就可以了。

下来给大家一个链接是ProtoBuf 常用序列化/反序列化API

http://blog.csdn.net/sealyao/article/details/6940245