2016-12-01 3 views
2

This Antwort zeigt deutlich einige Beispiele für Proto-Text-Parsing, hat aber kein Beispiel für Karten.protobuf Textformat Parsing Karten

Wenn ein Proto hat:

map<int32, string> aToB 

würde ich so etwas wie erraten:

aToB { 
    123: "foo" 
} 

, aber es funktioniert nicht. Kennt jemand die genaue Syntax?

+1

Versuchen Sie die Codierung in das Textformat, so dass Sie sehen, wie es sein sollte? – jpa

Antwort

1

Ich versuchte zunächst aus earlier answer Extrapolierung, die mich in die Irre geführt, weil ich falsch mehrere k/v Paare gedacht würde wie folgt aussehen:

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

das führte zu dem folgenden Fehler:

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

Die richtige Syntax für mehrere Schlüssel-Wert-Paare:

(Hinweis: Ich bin die „proto3“ Version des Protokolls Puffer Sprache)

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

Das Muster der den Namen der Wiederholung map-Variable macht mehr Sinn nach dem erneuten Lesen this relevant portion of the proto3 Map documentation, die erklärt, dass Karten sind gleichbedeutend mit der Definition Ihrer eigenen "Paar" Nachrichtentyp und dann als "wiederholt" zu markieren.


Ein vollständigeres Beispiel:

proto Definition:

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; 
} 

Textformat ("pbtxt") in einer Konfigurationsdatei:

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

++ C Das würde Generieren Sie den Nachrichteninhalt programmgesteuert

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

Das Textformat ist:

aToB { 
    key: 123 
    value: "foo" 
}