真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++ Protobuf

Protobuf

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

Proto3中的數(shù)據(jù)類型限定修飾符:

repeated 表示一個數(shù)組類型

protobuf中常用的數(shù)據(jù)類型:

  • bool, 布爾類型
  • double, 64位浮點數(shù)
  • float, 32位浮點數(shù)
  • int32, 32位整數(shù)
  • int64, 64位整數(shù)
  • uint64, 64位無符號整數(shù)
  • sint32, 32位整數(shù),處理負(fù)數(shù)效率更高
  • sint64, 64位整數(shù),處理負(fù)數(shù)效率更高
  • string, 只能處理ASCII字符
  • bytes, 用于處理多字節(jié)的語言字符
  • enum, 枚舉類型

默認(rèn)值

解析消息時,如果編碼的消息不包含特定的單數(shù)元素,則已分析對象中的相應(yīng)字段將設(shè)置為該字段的默認(rèn)值。這些默認(rèn)值是特定于類型的:

  • 對于字符串,默認(rèn)值為空字符串。
  • 對于字節(jié),默認(rèn)值為空字節(jié)。
  • 對于布爾值,默認(rèn)值為 false。
  • 對于數(shù)值類型,默認(rèn)值為零。
  • 對于枚舉,默認(rèn)值是第一個定義的枚舉值,該值必須為 0。
  • 對于消息字段,未設(shè)置該字段。它的確切值取決于語言。

舉個栗子

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;
}

編譯運(yùn)行加 -lprotobuf

轉(zhuǎn)換接口

#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();
}

文章名稱:C++ Protobuf
本文路徑:http://weahome.cn/article/dsoigcd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部