Как буферы протокола могут поддерживать сериализацию / десериализацию контейнеров std? - PullRequest
4 голосов
/ 26 марта 2009

Мы планируем заменить Boost.serialization на буферы протокола, используемые при проектировании распределенных систем. Как буферы протокола поддерживают сложные структуры данных, такие как контейнеры std?

Например, в нашем случае такой класс необходимо сериализовать / десериализовать:

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

Ответы [ 2 ]

4 голосов
/ 17 апреля 2009

Представление protobuf вашего Foo будет выглядеть примерно так:

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

Обратите внимание, что буферы протокола не обеспечивают "бесшовную" (де) сериализацию в / из ваших собственных структур, как это делает Boost.Serialization. Вы работаете с сгенерированными объектами, полученными при запуске компилятора protoc в файле, подобном приведенному выше.

Эти сгенерированные классы не будут содержать std::pair и std::vector членов, поэтому вам придется копировать данные также / из сгенерированных объектов, если вы хотите продолжать работать со своей устаревшей структурой Foo.

4 голосов
/ 26 марта 2009

В буферах протокола используется синтаксический анализатор, который принимает файл .proto и создает соответствующие процедуры сериализации. Смотрите это .

Обновление: Вы можете представить вектор строк как:

message MyCollection {   
   repeated string str = 1;
} 

в вашем файле прото.

и использование:

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

Это должно быть легко расширить для другой коллекции / коллекции коллекций.

...