我们计划用分布式系统设计中使用的协议缓冲区替换Boost.serialization
。协议缓冲区如何支持复杂的数据结构,如std容器?
例如,在我们的例子中,需要对这样的类进行序列化/反序列化:
class Foo
{
std::vector< std::pair< unsigned int, std::vector< std::pair< int, int> > > > data;
};
答案 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::pair
和std::vector
成员,因此如果您想继续处理遗留的{{1},那么您还需要从生成的对象中复制数据。结构。