protobuf (protocol buffer) 是谷歌內(nèi)部的混合語言數(shù)據(jù)標(biāo)準(zhǔn)。通過將結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行序列化(串行化),用于通訊協(xié)議、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)、平臺無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。
我們一直強(qiáng)調(diào)網(wǎng)站設(shè)計制作、成都網(wǎng)站制作對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站設(shè)計公司不一定是大公司,成都創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
序列化: 將結(jié)構(gòu)數(shù)據(jù)或者對象轉(zhuǎn)換成能夠用于存儲和傳輸?shù)母袷健?/p>
反序列化: 在其他的計算環(huán)境中,將序列化后的數(shù)據(jù)還原為數(shù)據(jù)結(jié)構(gòu)和對象
sudo apt install autoconf automake libtool curl make g++ unzip
https://github.com/protocolbuffers/protobuf/releases/
cd protobuf
./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig
repeated 表示一個數(shù)組類型
解析消息時,如果編碼的消息不包含特定的單數(shù)元素,則已分析對象中的相應(yīng)字段將設(shè)置為該字段的默認(rèn)值。這些默認(rèn)值是特定于類型的:
syntax = "proto3"; //默認(rèn)proto2,這里用proto3
package pt; //C++ 類似 namespace
enum EnMsgType{
EnMsgTypeP = 0; //占位
LOGIN_MSG = 1; // 登錄消息
LOGIN_MSG_ACK = 2; // 登錄響應(yīng)消息
LOGIN_OUT_MSG = 3; // 注銷消息
REG_MSG = 4; // 注冊消息
REG_MSG_ACK = 5; // 注冊響應(yīng)消息
ONE_CHAT_MSG = 6; // 聊天消息
ADD_FRIEND_MSG = 7; // 添加好友消息
CREATE_GROUP_MSG = 8; // 創(chuàng)建群組
ADD_GROUP_MSG = 9; // 加入群組
GROUP_CHAT_MSG = 10; // 群聊天
}
message MsgType{
EnMsgType msgtype = 1;
}
enum ErrCode {
SUCCESS = 0; //正確
FAILURE = 1; //失敗
ONLINE = 2; //已在線
};
message FriendsInfo {
int32 id = 1;
string name = 2;
string state = 3;
}
message UsersInfo{
int32 id = 1;
string name = 2;
string state = 3;
string role = 4;
}
message GroupsInfo{
int32 id = 1;
string groupname = 2;
string groupdesc = 3;
repeated UsersInfo users = 4;
}
message Login {
MsgType msgid = 1;
int32 id = 2;
string pwd = 3;
}
message LoginRsp{
MsgType msgid = 1;
int32 id = 2;
string name = 3;
repeated string offlinemsg = 4;
repeated FriendsInfo friends = 5;
repeated GroupsInfo groups = 6;
ErrCode errcode = 7;
string errmsg = 8;
}
protoc test.proto --cpp_out=./
#include
#include "test.pb.h"
int main() {
pt::Register reg;
pt::MsgType* msg = reg.mutable_msgid();
msg->set_msgtype(pt::EnMsgType::LOGIN_MSG);
reg.set_name("cmf");
reg.set_pwd("");
std::string str;
reg.SerializeToString(&str); //序列化
std::cout << str.c_str() << std::endl;
pt::Register res;
if (res.ParseFromString(str)) { //反序列化
std::cout << res.msgid().msgtype() << " " << res.name() << " " << res.pwd() << std::endl;
}
pt::LoginRsp loginRsp;
pt::MsgType* m = loginRsp.mutable_msgid();
m->set_msgtype(pt::EnMsgType::LOGIN_MSG_ACK);
loginRsp.set_id(1);
loginRsp.set_name("cmf");
loginRsp.set_errcode(pt::ErrCode::SUCCESS);
loginRsp.set_errmsg("test");
loginRsp.add_offlinemsg("nihao");
pt::FriendsInfo *info = loginRsp.add_friends();
info->set_name("cc");
info->set_id(2);
info->set_state("no");
std::string strr;
loginRsp.SerializeToString(&strr);
std::cout << strr << std::endl;
for (int i = 0; i < loginRsp.friends_size(); ++i) {
pt::FriendsInfo info = loginRsp.friends(i);
std::cout << info.name() << " " << info.id() << " " << info.state() << std::endl;
}
return 0;
}
#include
using google::protobuf::util::JsonStringToMessage;
bool proto_to_json(const google::protobuf::Message& message, std::string& json) {
google::protobuf::util::JsonPrintOptions options;
options.add_whitespace = true;
options.always_print_primitive_fields = true;
options.preserve_proto_field_names = true;
return MessageToJsonString(message, &json, options).ok();
}
bool json_to_proto(const std::string& json, google::protobuf::Message& message) {
return JsonStringToMessage(json, &message).ok();
}