1.camke的安裝和protobuf源碼下載
? ? ? ? 略過塘安,自行百度下載。
2.使用cmake編譯protobuf源碼援奢。
3.測試生成的工具兼犯。
? ? 自行編寫proto文件,文件后綴為.proto。
syntax="proto2";
package RingBind;
message MBUI_GetOrSetRingBinding
{
optional int32 hSeeion = 1;
optional int32 CircuitID = 2;
optional MBUI_RingBindingVec oRingBinding = 3;
}
message MBUI_RingBindingVec
{
repeated MBUI_RingBind oRingBind = 1;
}
message MBUI_RingBind
{
optional int32? iStartNeID = 1;
optional int32? iEndNeID = 2;
optional int32? iRingID = 3;
}
///////在上一步生成的protoc.exe目錄下cmd運(yùn)行 protoc.exe免都,protoc --cpp_out=./? test .proto,成功會生成兩個文件test.pb.h和test.pb.cc锉罐。這兩個文件就相當(dāng)于腳本給你生成的一個類,在你的項目中直接添加現(xiàn)有項就可以绕娘。
參考文章:https://blog.csdn.net/hp_cpp/article/details/81561310
備注:本人參考參考原作者有一處設(shè)置不一樣脓规,即設(shè)置項目屬性的運(yùn)行庫
4.工程測試代碼。(簡單項目险领,沒寫啥注釋)
#include <iostream>
#include <fstream>
#include <string>
#include "RingBind.pb.h"
using namespace std;
void InitRingBind(RingBind::MBUI_GetOrSetRingBinding &oGetOrSetRingBinding)
{
//為message的簡單類型(int32,bool等)賦值
oGetOrSetRingBinding.set_hseeion(998);
oGetOrSetRingBinding.set_circuitid(15390);
//為內(nèi)嵌的message分配內(nèi)存侨舆,這里的內(nèi)嵌message的類型類型像Vector(數(shù)組),pRingBindingVec類似數(shù)組的首地址
RingBind::MBUI_RingBindingVec *pRingBindingVec =
oGetOrSetRingBinding.mutable_oringbinding();
//為數(shù)組添加一個元素
RingBind::MBUI_RingBind *pRingBind = pRingBindingVec->add_oringbind();
//為數(shù)組的第一個元素賦值
pRingBind->set_istartneid(690);
pRingBind->set_iendneid(640);
pRingBind->set_iringid(181135);
}
void WriteRingBind2File(string &out, RingBind::MBUI_GetOrSetRingBinding &oGetOrSetRingBinding)
{
fstream file(out.c_str(), ios::out | ios::trunc | ios::binary);
if (!file.is_open())
{
cout << out.c_str() << "? open failed" << endl;
return;
}
oGetOrSetRingBinding.SerializePartialToOstream(&file);
file.close();
}
void readRingBind2File(string &in, RingBind::MBUI_GetOrSetRingBinding &oGetOrSetRingBinding)
{
fstream file(in.c_str(), ios::in | ios::binary);
if (!file.is_open())
{
cout << in.c_str() << "? open failed" << endl;
return;
}
//從文件中解析出對象信息輸出
oGetOrSetRingBinding.ParseFromIstream(&file);
cout << "hseeion: " << oGetOrSetRingBinding.hseeion() << endl;
cout << "circuitid: " << oGetOrSetRingBinding.circuitid() << endl;
const RingBind::MBUI_RingBindingVec oRingBindVec =
oGetOrSetRingBinding.oringbinding();
for (int i = 0; i < oRingBindVec.oringbind_size()/*獲取數(shù)組的大小*/; i++)
{
const RingBind::MBUI_RingBind oRingBind = oRingBindVec.oringbind(i);
cout << "istartneid: " << oRingBind.istartneid() << endl;
cout << "istartneid: " << oRingBind.iendneid() << endl;
cout << "istartneid: " << oRingBind.iringid() << endl;
}
file.close();
}
int main()
{
RingBind::MBUI_GetOrSetRingBinding oGetOrSetRingBinding;
InitRingBind(oGetOrSetRingBinding);
string FileName("ser.txt");
WriteRingBind2File(FileName, oGetOrSetRingBinding);
RingBind::MBUI_GetOrSetRingBinding rGetOrSetRingBinding;
readRingBind2File(FileName, rGetOrSetRingBinding);
system("pause");
return 0;
}
運(yùn)行結(jié)果: