【问题标题】:How can protocol-buffers support serialization/deserialization of std containers?协议缓冲区如何支持标准容器的序列化/反序列化?
【发布时间】:2010-10-15 14:59:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ serialization protocol-buffers


    【解决方案1】:

    协议缓冲区使用了一个解析器,它接受一个 .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; 
    }
    

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

    【讨论】:

    • Google 的教程只介绍了如何序列化一个简单的结构。我的要求是关于 std 容器。如何编写我上面提到的原型文件?
    • 在 StackOverflow 上的另一个答案中提到了将向量复制到重复字段的更好方法:stackoverflow.com/questions/15499641/…
    【解决方案2】:

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

    请注意,Protocol Buffers 并不像 Boost.Serialization 那样为您自己的结构提供“无缝”(反)序列化。您可以使用在上述文件上运行 protoc 编译器生成的对象。

    但是,这些生成的类将不包含 std::pairstd::vector 成员,因此如果您想继续使用旧的 Foo 结构,则需要从生成的对象中复制数据。

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多