C++Protobuf的生成與使用

Asce66發表於2020-10-04

編寫.proto檔案

  1. syntax:表明protobuf的版本號(末尾不要忘了;)
  2. package:表明生成的類物件位於哪一個名稱空間(末尾不要忘了;)
  3. 每一個類屬性後面的必須跟一個編號,且不能重複
syntax="proto3";
package Protocol;
message User{
	string name=1;
	int32 age=2;
}
message UserGroup{
	repeated User userList=1;
}

.proto檔案轉為c++類

寫一個run.bat的批處理檔案(只要是xxx.bat就行)

  1. xxx.exe:用於生成類的可執行檔案
  2. –cpp_out:指定生成的類物件為cpp且檔案儲存至後面的相對路徑下
  3. xxx.proto:用於參照的proto檔案(相對路徑)
  4. pause:在執行完成後暫停視窗(不寫視窗一閃就關閉了),如果有報錯就便於定位修改

如果我們有多個.proto檔案那就寫多行這個命令(.bat是批處理命令檔案,都能執行),只根據不同的需求修改某些內容即可

protoc.exe --cpp_out=ProtobufTest2 User.proto
pause

點選.bat檔案,然後你就能在寫的路徑下看見這些自動生成的cpp檔案(仔細閱讀黑窗裡的文字,如果有錯誤照著修改即可)

image-20201004093326699

C++使用Protobuf物件

/*************************屬性獲取與修改**********************************/
Protocol::User user;
user.set_age(10);//設定物件的屬性
int age = user.age();//獲得物件屬性
Protocol::UserGroup UG;
auto p= UG.add_userlist();//在陣列屬性中增加一個元素,返回的是指向增加元素的指標
*p = user;//通過指標修改新增元素
Protocol::User user2 = UG.userlist(0);//獲得陣列屬性中指定下標元素(沒有索引的方式)
/***********************************序列化與反序列化***************************************/
string str;
UG.SerializeToString(&str);
Protocol::UserGroup UG2;
UG2.ParseFromString(str);
/****************************************反射********************************************/
string protoName="Protocol.UserGroup";//需要生成的類名字(前面是命名,名稱空間的名稱)
//通過DescriptorPool獲得物件的descriptor
auto descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(protoName);
//使用descriptor獲得物件型別
auto type = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
//例項化
auto message = type->New();
//為例項化的物件反序列化資料
message->ParseFromString(str);

相關文章