protobuf編譯、安裝和簡單使用(Windows+VS平臺)

windows下安裝Protobuf

首先須要下載源代碼
下載以下cpp版本
image.png
解壓後獲得一個目錄,等下CMake會用到
若是你電腦沒有CMake,須要去官網下載
image.png
雙擊打開下載解壓後的CMake目錄/bin/cmake-gui.exe
如今,選擇剛纔解壓的目錄,和構建輸出目錄
image.png
而後選擇Configure
image.png
選擇你的VS版本,而後finish便可
image.png
點擊Generate,成功後,進入生成後的目錄
image.png
使用VS打開這個項目
image.png
編譯libprotobuf,protoc,libprotoc這三個
image.png
編譯就結束了,接下來開始使用protobufios

VS中使用protobuf

在本身建立的項目下,新建一個Account.proto,內容以下git

syntax = "proto3";
package IM;
message Account {
    //帳號
    uint64 ID = 1;
    //名字
    string name = 2;
    //密碼
    string password = 3;
}

message User {
    Account user = 1;
}

將剛纔編譯後的libprotobufd.libprotoc.exe拷貝到本身建立的項目下,按住shift+右鍵,選擇打開CMD,輸入protoc --cpp_out=./ Account.proto,發現目錄中多了兩個文件,一個.h頭文件一個.cc源文件
image.png
打開Account.pb.h頭文件,發現package就是命名空間,Account是類,大概以下代碼github

namespace IM {
    class Account {
        //一些方法
    };
    class User {
        //一些方法
    }
};

而後將生成的代碼手動添加到項目中,
接下來的步驟比較關鍵
先將平臺設置爲全部平臺
image.png
右鍵打開項目的屬性,修改一下屬性
image.png
關閉安全警告_SCL_SECURE_NO_WARNINGS
image.png
添加以前編譯好的庫
image.png
添加以前拷貝到項目中的庫若是有多個.lib,須要用分號隔開
image.png
還要將protobuf源碼中src/google文件夾拷貝到項目目錄下
image.png
而後設置包含你的項目目錄
image.png
而後,開始寫代碼了windows

#include <iostream>
#include <fstream>
#include "Account.pb.h"

using namespace std;

int main(int argc, char** argv)
{
    IM::Account account1;
    account1.set_id(1);
    account1.set_name("windsun");
    account1.set_password("123456");

    string serializeToStr;
    account1.SerializeToString(&serializeToStr);
    cout <<"序列化後的字節:"<< serializeToStr << endl;


    IM::Account account2;
    if(!account2.ParseFromString(serializeToStr))
    {
        cerr << "failed to parse student." << endl;
        return -1;
    }
    cout << "反序列化:" << endl;
    cout << account2.id() << endl;
    cout << account2.name() << endl;
    cout << account2.password() << endl;

    google::protobuf::ShutdownProtobufLibrary();

    return 0;
}

運行結果:
image.png數組

protobuf的一些方法

標準消息函數(Standard Message Methods)。 每個消息(message)還包含了其餘一系列函數,用來檢查或管理整個消息,包括:安全

bool IsInitialized() const; //檢查是否所有的required字段都被置(set)了值。

void CopyFrom(const Person& from); //用外部消息的值,覆寫調用者消息內部的值。

void Clear();   //將全部項復位到空狀態(empty state)。

int ByteSize() const;   //消息字節大小

關於Debug的API。函數

string DebugString() const; //將消息內容以可讀的方式輸出

string ShortDebugString() const; //功能相似於,DebugString(),輸出時會有較少的空白

string Utf8DebugString() const; //Like DebugString(), but do not escape UTF-8 byte sequences.

void PrintDebugString() const;  //Convenience function useful in GDB. Prints DebugString() to stdout.

關於解析&序列化(Parsing and Serialization)。ui

最後,每個protocol buffer類都有讀寫你所選擇的消息類型的函數。它們包括:google

**注意:** protocol buffers和麪向對象的設計 protocol buffer類一般只是純粹的數據存儲器(就像C++中的結構體同樣);它們在對象模型中並非一等公民。若是你想向生成的類中添加更豐富的行爲,最好的方法就是在應用程序中對它進行封裝。若是你無權控制.proto文件的設計的話,封裝protocol buffers也是一個好主意(例如,你從另外一個項目中重用一個.proto文件)。在那種狀況下,你能夠用封裝類來設計接口,以更好地適應你的應用程序的特定環境:隱藏一些數據和方法,暴露一些便於使用的函數,等等。可是你絕對不要經過繼承生成的類來添加行爲。這樣作的話,會破壞其內部機制,而且不是一個好的面向對象的實踐。
bool SerializeToString(string* output) const; //將消息序列化並儲存在指定的string中。注意裏面的內容是二進制的,而不是文本;咱們只是使用string做爲一個很方便的容器。

bool ParseFromString(const string& data); //從給定的string解析消息。

bool SerializeToArray(void * data, int size) const  //將消息序列化至數組

bool ParseFromArray(const void * data, int size)    //從數組解析消息

bool SerializeToOstream(ostream* output) const; //將消息寫入到給定的C++ ostream中。

bool ParseFromIstream(istream* input); //從給定的C++ istream解析消息。

這些函數只是用於解析和序列化的幾個函數罷了。請再次參考Message API reference以查看完整的函數列表。spa

注意: protocol buffers和麪向對象的設計 protocol buffer類一般只是純粹的數據存儲器(就像C++中的結構體同樣);它們在對象模型中並非一等公民。若是你想向生成的類中添加更豐富的行爲,最好的方法就是在應用程序中對它進行封裝。若是你無權控制.proto文件的設計的話,封裝protocol buffers也是一個好主意(例如,你從另外一個項目中重用一個.proto文件)。在那種狀況下,你能夠用封裝類來設計接口,以更好地適應你的應用程序的特定環境:隱藏一些數據和方法,暴露一些便於使用的函數,等等。可是你絕對不要經過繼承生成的類來添加行爲。這樣作的話,會破壞其內部機制,而且不是一個好的面向對象的實踐。

相關文章
相關標籤/搜索