いるProtobufコンパイル、インストール、およびC ++(Windowsの+ VSプラットフォーム)を使用するためのシンプルな

WindowsをインストールいるProtobuf

私たちは、最初にする必要があるソースコードをダウンロード

次のバージョンのcppをダウンロード

ディレクトリを開梱などはCMakeの下で使用されます

お使いのコンピュータはcmakeのは、Quguanネットワークに必要なされない場合は、ダウンロードを

解凍し、ダウンロードをダブルクリックして開きますCMake目录/bin/cmake-gui.exe

今、あなたは解凍したディレクトリ、およびビルド出力ディレクトリを選択

次に、[設定]を選択し

あなたのVSのバージョンを選択し、あなたが完了することができます

生成]をクリックした後、成功し、生成後のディレクトリに移動します

VSを使用してプロジェクトを開きます。

コンパイルlibprotobuf、protoc、libprotoc 3

コンパイルが終わった後、開始いる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、ディレクトリに二つ以上のファイル、1つの.Hヘッダファイルの.ccソースファイルを見つけます

オープンAccount.pb.hヘッダファイル、パッケージは名前空間で、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のいくつかの方法

標準メッセージ機能(標準メッセージメソッド)。各メッセージ(メッセージ)は、さらに、含む、全体のメッセージを確認するか、管理するために使用され、他の機能の数が含まれています。

bool IsInitialized() const; //检查是否全部的required字段都被置(set)了值。

void CopyFrom(const Person& from); //用外部消息的值,覆写调用者消息内部的值。

void Clear();   //将所有项复位到空状态(empty state)。

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

デバッグ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.

分析の&シリアライズ(解析およびシリアライズ)。

最後に、各クラスには、お好みのタイプのメッセージプロトコルバッファ機能を読み取りました。彼らは、次のとおりです。

**注意:** 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解析消息。

これらの機能は、唯一のいくつかの機能を解析し、塗りつぶしをシリアル化するために使用されています。再び参照してくださいメッセージAPIリファレンスを関数の完全なリストを参照してください。

注:プロトコルバッファとオブジェクト指向設計のプロトコルバッファクラスは、多くの場合、(としてC ++での構造など)だけで、純粋なデータメモリであり、それらは、オブジェクトモデルでファーストクラスの市民ではありません。あなたが生成されたクラスに、より豊かな振る舞いを追加したい場合は、最良の方法は、アプリケーションパッケージでそれを行うことです。あなたがデザイン.protoファイルを制御できません場合は、また、パッケージのプロトコル・バッファー良いアイデアは(たとえば、あなたが他のプロジェクトからファイルを再利用.proto)。使いやすいいくつかの機能を露出し、非表示にいくつかのデータとメソッド、およびように:その場合は、あなたがより良いあなたのアプリケーション固有の環境に合わせて、インターフェースパッケージのクラスを設計することができます。しかし、あなたはクラスを継承することで生成された動作を追加することはありません。そうするためには、その内部の仕組みを損傷し、優れたオブジェクト指向のプラクティスではありませんでしょう。

おすすめ

転載: www.cnblogs.com/WindSun/p/12543066.html