如何使用Protocol Buffers将多态对象数组序列化为文件?

时间:2014-11-05 18:31:00

标签: c++ serialization protocol-buffers

拥有数组std::vector<BaseClass*>使用Google的协议缓冲区库将此数组保存到文件的正确方法是什么?

BaseClass是类的层次结构的基类,它有几个子类。 谷歌的协议缓冲区是否适用于此目的,或者可能首选其他库?

3 个答案:

答案 0 :(得分:1)

协议缓冲区允许重复字段,这些字段在代码中就像std::vector一样。对于多态对象,您可以使用扩展框架。请参阅扩展标题下的here

答案 1 :(得分:1)

您可以创建列表消息MyList,其中包含Class类型的元素。在那里,您需要为每个子类提供特定的消息:

message MyList{
    repeated Class entry = 1;
}

message Class{
    required BaseProperties baseProperties = 1;

    oneof{
        SubClassOne sub_one_properties = 2;
        SubClassTwo sub_two_properties = 3;
        ...
    }
}

message BaseProperties{
    //contains common properties of BaseClass
}

message SubClassOne{
    //contains specific properties of one this SubClass
}

message SubClassTwo{
    //contains specific properties of one this SubClass
}

如果您不喜欢oneof关键字,或者使用较旧的libprotobuf,您还可以插入带有类型信息的枚举并添加相应的可选消息字段:

message Class{
    enum ClassType{
        SUB_CLASS_ONE = 1;
        SUB_CLASS_TWO = 2;
    }

    required ClassType type = 1;
    required BaseProperties baseProperties = 2;

    optional SubClassOne sub_one_properties = 3;
    optional SubClassTwo sub_two_properties = 4;
    ...
}

答案 2 :(得分:1)

如上所述,您必须使用扩展机制来实现多态性。 您可以找到有用的http://www.indelible.org/ink/protobuf-polymorphism/

链接