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


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.libprotoc.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文件)。在那種情況下,你可以用封裝類來設計接口,以更好地適應你的應用程序的特定環境:隱藏一些數據和方法,暴露一些便於使用的函數,等等。但是你絕對不要通過繼承生成的類來添加行為。這樣做的話,會破壞其內部機制,並且不是一個好的面向對象的實踐。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM