Google Protocol Buffersの紹介とまとめ


protobufのいくつかのポイントを簡単に紹介し、まとめ、私が前に作ったpptから抜粋し、protobuf初心者の入門時間を節約したいと思っています.これは簡単なDemoです.
ProtobufプロフィールProtobufフルネームGoogle Protocol Buffers
http://code.google.com/p/protobuf構造化データ記憶フォーマット(xml,json)は、通信プロトコル、データ記憶などの効率的なシーケンス化と逆シーケンス化言語の無関係、プラットフォームの無関係、拡張性の良い公式サポートC++,Java,Pythonの3言語に用いる.protoファイル定義とメッセージ定義ファイルuser_の使用def.proto
package user; message UserInfo { required int64 id = 1; optional string name = 2; repeated bytes nick_name = 3; } コンパイルproto,解析器コードの生成
protoc –cpp_out . user.proto//user_def.pb.h user_def.pb.cc protoc –java_out . user.proto//user/UserInfo.JAvaフィールドID optional string name=2;
一意性シーケンス化後、1~15が1バイト、16~2047が2バイトのフィールドタイプを占めるhttps://developers.google.com/protocol-buffers/docs/proto#scalar string vs. bytes
.protoタイプc++タイプjavaタイプ説明string std::string Stringは、UTF-8またはASCIIテキストbyttes stdである必要があります::string ByteString任意のバイトシーケンス作成推奨共通メッセージフィールド(特にrepeatedフィールド)のIDは、できるだけ1~15の間に割り当てられます.可能な限り多く(すべて)optionalフィールドを使用します.ネーミング方法.protoファイル名はunderscore_speparated_namesを使用します.メッセージ名はCamelCaseNameを使用します.フィールド名はunderscore_separated_namesを使用します.互換性はフィールドのIDを変更することはできません.requiredフィールドは削除できません.https://developers.google.com/protocol-buffers/docs/proto#updatingシーケンス化されたprotobufメッセージのシーケンスのキー値ペアであり、キーはメッセージフィールドのIDである.既知のメッセージフィールド(.protoファイル定義)は、そのID順に並べられています.不明なメッセージフィールド:c++とjava:既知のフィールドの後に並べられ、順序が異なります.python:未知のフィールドは保持されません.値が割り当てられていないoptionalメッセージフィールドは含まれません.little-endianバイトシーケンスを使用して格納します.反射反射はprotobufの重要な特性であり、関連するクラスは主に以下のとおりである.
Message Message MessageFactory Reflection Descriptor FieldDescriptor Descriptor Pool名前に基づいてメッセージを作成する以下は、メッセージ名(package nameを含む)に基づいてprotobufメッセージを作成するC++関数であり、返されるメッセージは使い終わった後にdeleteを落とさなければならないことに注意してください.
Message*createMessage(const string&typeName){Message*message=NULL;////////messageのdescriptor const Descriptor*descriptor=DescriptorPool::genated_pool()->FinMesageTypeByName(typeName);if(descriptor){////default message(prototype)const Message*prototype=Message Factory::generated_factory()::generated_factory()::generated_factory()::generated_factory()::generated_factory(()::generated_factory_factory(()::generated->GetPrototype(descriptor); if(NULL!=prototype){//修正可能なmessage=prototype->New()}}を作成return message; } 変更メッセージメッセージメッセージは、メッセージのフィールド名に基づいて値を変更します.上のuserでUserInfoを例として、新しいUserInfoメッセージのidフィールドを100に設定します.
int main()/上の関数を使用して新しいUserInfo message*msg=createMessage("user.UserInfo");if(NULL==msg){//作成に失敗しました.メッセージ名エラーか、コンパイル後のmessage解析器//がメインプログラムにリンクされていない可能性があります.return-1;}
//   message descriptor
const Descriptor* descriptor = msg->GetDescriptor();
//   message     ,            
const Reflection* reflection = msg->GetReflection();

//        message   descriptor
const FieldDescriptor* idField = descriptor->FindFieldByName("id");
//  id   100
if (NULL != idField) {
    reflection->SetInt64(msg, idField, 100);
}

// ...     

//     message
delete msg;

return 0;

}文字列またはストリームからメッセージを読み込みcreateMessageで空のメッセージを作成した後、最も一般的な使用シーンは、MessageのParseFromStringまたはParseFromIstreamメソッドを使用して文字列またはストリームからシーケンス化されたmessageを読み出すことです.
Message *msg = createMessage("user.UserInfo");
if (NULL != msg) {
    if (!msg->ParseFromString("... serialized message string ... ")) {
        //     
        ...
    }
}

Protobufの利点拡張性と前後互換性の導入(import)定義済みメッセージネストメッセージの効率化https://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking大量の小さなデータ(単一Messageで1 Mを超えない)を処理するのに適しているProtobufの劣勢は内蔵されていないSet,Mapなどのコンテナタイプです.単一Messageが1 Mを超えるシナリオの処理には適していません.詳細はLarge Data Setsを参照してください.さらに読むprotoガイドhttps://developers.google.com/protocol-buffers/docs/proto .proto仕様https://developers.google.com/protocol-buffers/docs/styleシーケンシャルコーディング方式https://developers.google.com/protocol-buffers/docs/encodingチュートリアルhttps://developers.google.com/protocol-buffers/docs/tutorialsインタフェースドキュメントhttps://developers.google.com/protocol-buffers/docs/reference/overview Protobuf benchmarking https://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking資料を読むProtobuf documentation Protobufの使用と原理
変換元:http://blog.atime.me/note/protobuf-introduction.html