須要弄一個寫結構體的類,想到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
經常使用序列化函數: