首先須要下載源代碼
下載以下cpp版本
解壓後獲得一個目錄,等下CMake會用到
若是你電腦沒有CMake,須要去官網下載
雙擊打開下載解壓後的CMake目錄/bin/cmake-gui.exe
如今,選擇剛纔解壓的目錄,和構建輸出目錄
而後選擇Configure
選擇你的VS版本,而後finish便可
點擊Generate,成功後,進入生成後的目錄
使用VS打開這個項目
編譯libprotobuf,protoc,libprotoc這三個
編譯就結束了,接下來開始使用protobufios
在本身建立的項目下,新建一個Account.proto,內容以下git
syntax = "proto3"; package IM; message Account { //帳號 uint64 ID = 1; //名字 string name = 2; //密碼 string password = 3; } message User { Account user = 1; }
將剛纔編譯後的libprotobufd.lib
和protoc.exe
拷貝到本身建立的項目下,按住shift+右鍵
,選擇打開CMD,輸入protoc --cpp_out=./ Account.proto
,發現目錄中多了兩個文件,一個.h頭文件一個.cc源文件
打開Account.pb.h頭文件,發現package就是命名空間,Account是類,大概以下代碼github
namespace IM { class Account { //一些方法 }; class User { //一些方法 } };
而後將生成的代碼手動添加到項目中,
接下來的步驟比較關鍵
先將平臺設置爲全部平臺
右鍵打開項目的屬性,修改一下屬性
關閉安全警告_SCL_SECURE_NO_WARNINGS
添加以前編譯好的庫
添加以前拷貝到項目中的庫若是有多個.lib,須要用分號隔開
還要將protobuf源碼中src/google
文件夾拷貝到項目目錄下
而後設置包含你的項目目錄
而後,開始寫代碼了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; }
運行結果:
數組
標準消息函數(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文件)。在那種狀況下,你能夠用封裝類來設計接口,以更好地適應你的應用程序的特定環境:隱藏一些數據和方法,暴露一些便於使用的函數,等等。可是你絕對不要經過繼承生成的類來添加行爲。這樣作的話,會破壞其內部機制,而且不是一個好的面向對象的實踐。