windows下安裝Protobuf
首先需要下載源代碼
下載如下cpp版本

解壓后得到一個目錄,等下CMake會用到
如果你電腦沒有CMake,需要去官網下載

雙擊打開下載解壓后的CMake目錄/bin/cmake-gui.exe
現在,選擇剛才解壓的目錄,和構建輸出目錄

然后選擇Configure

選擇你的VS版本,然后finish即可

點擊Generate,成功后,進入生成后的目錄

使用VS打開這個項目

編譯libprotobuf,protoc,libprotoc這三個

編譯就結束了,接下來開始使用protobuf
VS中使用protobuf
在自己創建的項目下,新建一個Account.proto,內容如下
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是類,大概如下代碼
namespace IM {
class Account {
//一些方法
};
class User {
//一些方法
}
};
然后將生成的代碼手動添加到項目中,
接下來的步驟比較關鍵
先將平台設置為所有平台

右鍵打開項目的屬性,修改一下屬性

關閉安全警告_SCL_SECURE_NO_WARNINGS

添加之前編譯好的庫

添加之前拷貝到項目中的庫如果有多個.lib,需要用分號隔開

還要將protobuf源碼中src/google文件夾拷貝到項目目錄下

然后設置包含你的項目目錄

然后,開始寫代碼了
#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;
}
運行結果:

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)。
最后,每一個protocol buffer類都有讀寫你所選擇的消息類型的函數。它們包括:
**注意:** 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以查看完整的函數列表。
注意: protocol buffers和面向對象的設計 protocol buffer類通常只是純粹的數據存儲器(就像C++中的結構體一樣);它們在對象模型中並不是一等公民。如果你想向生成的類中添加更豐富的行為,最好的方法就是在應用程序中對它進行封裝。如果你無權控制.proto文件的設計的話,封裝protocol buffers也是一個好主意(例如,你從另一個項目中重用一個.proto文件)。在那種情況下,你可以用封裝類來設計接口,以更好地適應你的應用程序的特定環境:隱藏一些數據和方法,暴露一些便於使用的函數,等等。但是你絕對不要通過繼承生成的類來添加行為。這樣做的話,會破壞其內部機制,並且不是一個好的面向對象的實踐。
