协议缓冲区如何支持std容器的序列化/反序列化?

时间:2009-03-26 03:13:24

标签: c++ serialization protocol-buffers

我们计划用分布式系统设计中使用的协议缓冲区替换Boost.serialization。协议缓冲区如何支持复杂的数据结构,如std容器?

例如,在我们的例子中,需要对这样的类进行序列化/反序列化:

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

2 个答案:

答案 0 :(得分:4)

协议缓冲区使用了一个解析器,它接受.proto文件并创建适当的序列化例程。请参阅this

更新:您可以将字符串向量表示为:

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

应该很容易扩展到另一个集合/集合集合。

答案 1 :(得分:4)

你的Foo的protobuf代表看起来像这样:

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那样为您自己的结构提供“无缝”(de)序列化。您可以使用在上述文件上运行protoc编译器的生成对象。

但是,这些生成的类不会包含std::pairstd::vector成员,因此如果您想继续处理遗留的{{1},那么您还需要从生成的对象中复制数据。结构。