protobuf 使用說明和各類坑

須要弄一個寫結構體的類,想到protubuf,通過各類坑,總結以下,但願幫助須要到人html

個人proto文件:node

//option optimize_for = LITE_RUNTIME;
message Node{
    required int64 nodeId = 1;
    required string passwd = 2;
    required double x = 3;
    //required double y = 4;
    //required int64 parrendId = 5;
    //required double distendParrent = 6;
}

使用protoc 文件 --cpp_out .  輸出.cc 和 .h 文件ios

編譯Makefiile( 簡單寫的):函數

all:
	protoc node.proto --cpp_out .
	g++ main.cpp node.pb.cc `pkg-config --libs --cflags protobuf` -g

測試文件,主要是main.cpp:測試

/*************************************************************************
	> File Name: main.cpp
	> Author: MaShiChuan
	> Mail: 981880785@qq.com
	> Created Time: 2016年12月17日 星期六 11時22分44秒
 ************************************************************************/

#include<iostream>
#include "node.pb.h"
#include <fstream>
using namespace std;
int main(){
    GOOGLE_PROTOBUF_VERIFY_VERSION; 
    fstream fout("d.dat",ios::out|ios::binary);
    Node a;
    a.set_nodeid(3);
    a.set_x(3.3);
    a.set_passwd("33");
    a.SerializeToOstream(&fout); 
    a.set_nodeid(4);
    a.SerializeToOstream(&fout); 
    a.SerializeToOstream(&fout); 
    fout.close();
    fstream fin("d.dat",ios::in|ios::binary);
    string line;
    do{
        Node b;
        getline(fin,line,'@');
        if(line == ""){
            break;
        }
        //cout<<line<<endl;
        //b.ParseFromIstream(&fin);
        b.ParseFromString(line);
        cout<<b.nodeid()<<endl;
        cout<<b.passwd()<<endl;
    }while(!fin.eof());
    google::protobuf::ShutdownProtobufLibrary();
    return 0;
}

使用方法:ui

proto文件中規定好有那些東西須要存儲,main.cpp中設置值, 相關函數能夠從.cc文件中找找。很少說。google

有關如何序列化和反序列化,參考下面的文檔,spa

我遇到的問題是,向文件中寫了三個message,想依次讀出了來,結果反序列化與序列化不對應,老是讀最後一個message..net

ParseFromStream不能用,用 cat data文件打開是有分行的,想用ParseFromString,分行解析,結果仍是不行,code

網上查類許多資料,沒說怎麼處理,索性把data文件打開看看,od -a  查看以下:

0000000  bs etx dc2 stx   3   3  em   f   f   f   f   f   f  nl   @  bs
0000020 eot dc2 stx   3   3  em   f   f   f   f   f   f  nl   @  bs eot
0000040 dc2 stx   3   3  em   f   f   f   f   f   f  nl   @
0000055

明顯有個分割符@,getline函數正好有個輸入分隔符的參數,難道要用@分行,而後試了試,發現果真能夠。

但願能幫助須要的人。

參考文檔:

入門手冊:

http://www.cnblogs.com/stephen-liu74/archive/2013/01/04/2842533.html

類型說明:

http://blog.csdn.net/superbfly/article/details/17920383

參考手冊:

http://pages.cs.wisc.edu/~starr/bots/Undermind-src/html/annotated.html

經常使用序列化函數:

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

相關文章
相關標籤/搜索