天天看點

使用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

繼續閱讀