2016-12-01 11 views
2

This答えは、protoテキスト解析のいくつかの例を明確に示していますが、マップの例はありません。プロトがある場合はprotobufテキスト形式の解析マップ

map<int32, string> aToB 

私のようなもの推測:

aToB { 
    123: "foo" 
} 

を、それは動作しません。誰かが正確な構文を知っていますか?

+1

テキスト形式にエンコードしてみてください。どのように表示する必要がありますか? – jpa

答えて

1

私が間違って複数のk/Vのペアは次のようになりだろうと思ったので、私は最初に、迷う私を導いearlier answerから外挿してみました:

aToB {   # (this example has a bug) 
    key: 123 
    value: "foo" 
    key: 876  # WRONG! 
    value: "bar" # NOPE! 
} 

libprotobuf ERROR: Non-repeated field "key" is specified multiple times. 

:それは次のエラーにつながりました複数のキーと値のペアのための0

適切な構文:

(注:私は、プロトコルバッファ言語の「proto3」バージョンを使用しています)

aToB { 
    key: 123 
    value: "foo" 
} 
aToB { 
    key: 876   
    value: "bar"  
} 

の名前を繰り返すパターンマップ変数はthis relevant portion of the proto3 Map documentationを再読した後でより意味をなさきます。マップは独自の「ペア」メッセージタイプを定義し、それを「繰り返し」としてマークすることと同じです。


より完全な例:

プロト定義:

syntax = "proto3"; 
package myproject.testing; 

message UserRecord { 
    string handle = 10; 
    bool paid_membership = 20; 
} 

message UserCollection { 
    string description = 20; 
    // HERE IS THE PROTOBUF MAP-TYPE FIELD: 
    map<string, UserRecord> users = 10; 
} 

message TestData { 
    UserCollection user_collection = 10; 
} 

テキスト形式( "pbtxt")設定ファイルで:

user_collection { 
    description = "my default users" 
    users { 
    key: "user_1234" 
    value { 
     handle: "winniepoo" 
     paid_membership: true 
    } 
    } 
    users { 
    key: "user_9b27" 
    value { 
     handle: "smokeybear" 
    } 
    } 
} 

だろうC++プログラムによるメッセージコンテンツの生成

myproject::testing::UserRecord user_1; 
user_1.set_handle("winniepoo"); 
user_1.set_paid_membership(true); 
myproject::testing::UserRecord user_2; 
user_2.set_handle("smokeybear"); 
user_2.set_paid_membership(false); 

using pair_type = 
    google::protobuf::MapPair<std::string, myproject::testing::UserRecord>; 

myproject::testing::TestData data; 
data.mutable_user_collection()->mutable_users()->insert(
    pair_type(std::string("user_1234"), user_1)); 
data.mutable_user_collection()->mutable_users()->insert(
    pair_type(std::string("user_9b27"), user_2)); 
0

テキスト形式は次のとおりです。

aToB { 
    key: 123 
    value: "foo" 
} 
関連する問題