拥有数组std::vector<BaseClass*>
使用Google的协议缓冲区库将此数组保存到文件的正确方法是什么?
BaseClass
是类的层次结构的基类,它有几个子类。
谷歌的协议缓冲区是否适用于此目的,或者可能首选其他库?
答案 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/
链接