Protobufの理解について
4692 ワード
文書ディレクトリ
Protobufの理解について
Protobufとは
公式文書の説明:
protocol buffersは、言語に関係なく、プラットフォームに関係なく、拡張可能なシーケンス化構造データの方法であり、通信プロトコル、データストレージなどに使用することができる.Protocol Buffersは、柔軟で効率的で自動化されたメカニズムの構造データシーケンス化方法であり、XMLよりも分類可能であるが、XMLよりも小さく(3~10倍)、より速く(20~100倍)、より簡単である.データの構造を定義し、特殊に生成されたソースコードを使用して、さまざまなデータストリームでさまざまな言語を使用して構造データの作成と読み取りを簡単に行うことができます.古いデータ構造でコンパイルされたデプロイメントされたプログラムを破壊することなく、データ構造を更新することもできます.
まとめ:言語に関係なく、プラットフォームに関係なく、効率的で、互換性が良い
Protoの使用
protoファイル作成の基本ルール
データ構造の定義// xxx.proto define xxx message
message xxx{
required string val_1 = 1
// required -> 1
optional string val_2 = 2
// optional -> 0 1
repeated string val_3 = 3
// repeated ->
message EmbeddMessage{
int32 int32val = 1
string stringVal = 2
}
optional EmbeddMessage example = 4
}
インタフェースコード生成# $SRC_DIR .proto
# --cpp_out c++
# $DST_DIR
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
コーディングこうぞう
Varints
各バイトは7ビットで数字を表し、最上位は後にデータがあるかどうかを表す.後ろから前へ符号化するので圧縮アルゴリズムでもあり、小さいデジタル圧縮ほど効果的です
ex1. var num int32 ; num=10、numのバイナリは:00000000 00000000 00000000 00001010
Varints符号化後:00001010
ex2. var num int32 ; num=300,numのバイナリ:00000000 00000000 00000001 00101100
Varints符号化後:10101100 00000010
Zigzag
符号ビットを最後にずらし、残りの31ビットを1つずつ前にし、負数であれば符号ビット以外のすべてのビットを逆にします.符号化目的:できるだけバイナリの中の1を減らして、データ圧縮コードの実現を便利にする:int int2zigzag(int n){
return (n<<1)^(n>>31);
}
int zigzag2int(int n){
return (((unsignedint)n) >> 1) ^ -(n & 1)
}
Message structure
Repeated
Map
// xxx.proto define xxx message
message xxx{
required string val_1 = 1
// required -> 1
optional string val_2 = 2
// optional -> 0 1
repeated string val_3 = 3
// repeated ->
message EmbeddMessage{
int32 int32val = 1
string stringVal = 2
}
optional EmbeddMessage example = 4
}
# $SRC_DIR .proto
# --cpp_out c++
# $DST_DIR
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
int int2zigzag(int n){
return (n<<1)^(n>>31);
}
int zigzag2int(int n){
return (((unsignedint)n) >> 1) ^ -(n & 1)
}