2009-03-26 6 views
4

Nous prévoyons de remplacer Boost.serialization par des tampons de protocole utilisés dans la conception de systèmes distribués. Comment les tampons de protocole supportent des structures de données compliquées comme les conteneurs std?Comment les tampons de protocole peuvent-ils prendre en charge la sérialisation/désérialisation des conteneurs std?

Par exemple, une telle classe doit être sérialisé/désérialisé dans notre cas:

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

Répondre

4

tampons de protocole ont utiliser un analyseur qui prend un fichier .proto et crée des routines de sérialisation appropriées. Voir this.

Mise à jour: Vous pouvez représenter un vecteur de chaînes comme:

message MyCollection { 
    repeated string str = 1; 
} 

dans votre fichier proto.

et utilisation:

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

Il devrait être facile de prolonger pour une autre collection/collection de collections.

+0

Le didacticiel de Google a seulement présenté comment sérialiser une structure simple. Mon exigence concerne le conteneur std. Comment écrire des fichiers proto comme ce que j'ai mentionné ci-dessus? –

+1

Mise à jour avec du code. – dirkgently

4

La représentation protobuf de votre Foo ressemblerait à quelque chose comme ceci:

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

Notez que le protocole buffers ne fournit pas une sérialisation « transparente » (de) à/de vos propres structures comme Boost.Serialization ne . Vous travaillez avec les objets générés qui proviennent de l'exécution du compilateur protoc sur un fichier comme ci-dessus.

Ces classes générées ne contiennent cependant std::pair et std::vector membres vous aurez donc besoin de copier des données trop/des objets générés si vous voulez continuer à travailler avec la structure de votre héritage Foo.

Questions connexes