2009-03-26 13 views
4

Wir planen, Boost.serialization durch Protokollpuffer zu ersetzen, die im verteilten Systemdesign verwendet werden. Wie unterstützen Protokollpuffer komplizierte Datenstrukturen wie Standardcontainer?Wie können Protokollpuffer die Serialisierung/Deserialisierung von Standardcontainern unterstützen?

Zum Beispiel eine solche Klasse ist erforderlich, in unserem Fall serialisiert/deserialisiert werden:

class Foo 
{ 
    std::vector< std::pair< unsigned int, std::vector< std::pair< int, int> > > > data; 
}; 

Antwort

4

Protocol Buffers einen Parser verwenden haben, die eine .proto Datei nimmt und erstellt entsprechende Serialisierung Routinen. Siehe this.

Update: Sie einen Vektor von Strings als darstellen kann:

message MyCollection { 
    repeated string str = 1; 
} 

in Ihrer proto-Datei.

und Verwendung:

std::vector<std::string> my_strings; 
// add strings to vector MyCollection proto; 
vector<string>::iterator e = my_strings.end(); 
for (vector<string>::iterator i = my_strings.begin(); 
    i != e; 
    ++i) { 
    *proto.add_str() = *i; 
} 

sollte es leicht sein, für eine andere Sammlung/Sammlung von Sammlungen zu erweitern.

+0

Googles Tutorial hat nur gezeigt, wie man eine einfache Struktur serialisiert. Meine Anforderung ist über den Standardbehälter. Wie schreibe ich Proto-Dateien als das, was ich oben erwähnt habe? –

+1

Mit einem Code aktualisiert. – dirkgently

4

Die protobuf Darstellung Ihrer Foo würde wie folgt aussehen:

message IntPair { 
    required int32 first = 1; 
    required int32 second = 2; 
}; 

message FooElem { 
    required uint32 first = 1; 
    repeated IntPair second = 2; 
}; 

message Foo { 
    repeated FooElem data = 1; 
}; 

Beachten Sie, dass Protocol Buffers stellt keine „nahtlose“ (de) Serialisierung/aus dem eigenen Strukturen wie Boost.Serialization tut . Sie arbeiten mit generierten Objekten, die von der Ausführung des protoc-Compilers in einer Datei wie der obigen stammen.

Diese generierten Klassen enthalten nicht std::pair und std::vector Mitglieder jedoch, so dass Sie Daten müssen kopiert werden zu/von den generierten Objekten, wenn Sie mit Ihrem Erbe Foo Struktur weiter zu arbeiten wollen.

Verwandte Themen