本主题涉及提升序列化。
当我序列化多态对象时,只有当存档不等于this_type(即序列化对象的类型)时,存档才会存储有关true_type的信息(即对象的具体类型)。
即。 :序列化对象的类型仅在从基类序列化时才存储。
如何强制存档始终存储类型?
让我们用一个例子来说明,我不确定上面的文字是如此明显......:
让我们有2个可序列化的类:
class Base { ... };
class Leaf : public Base { ... };
如果我这样做:
std::stringstream ios(std::ios_base::binary | std::ios_base::out | std::ios_base::in);
Base* b = new Leaf();
boost::archive::text_oarchive ar(ios);
ar & b;
然后档案包含:
22序列化::存档9 0 4 叶 1 0 0 0 0 0 0 0 0
它包含Leaf具体类型信息。
但是,如果我这样做:
Leaf* b = new Leaf();
boost::archive::text_oarchive ar(ios);
ar & b;
然后档案包含:
22 serialization :: archive 9 0 1 0 0 0 0 0 0 0 0
它不包含Leaf类型信息。
如何生成存档 WITH 所有类型的true_type?
我搜索两种方式: - 调用归档类型的方法(register_type,save_pointer,...)失败 - 直接更改boost / archive / detail / oserializer.hpp文件: in struct polymorphic,in function template static void save(Archive& ar,T& t) 我发表评论
if(*this_type == *true_type){
const basic_pointer_oserializer * bpos = register_type(ar, t);
ar.save_pointer(vp, bpos);
return;
}
失败。
感谢您的帮助。
尼古拉斯。
PS:关于我为什么要这样做的话。 当true_type被“注册”时(我不确定register是正确的单词),我们可以将对象反序列化为任何基类。 例如://SERIALIZATION:
Leaf* leaf = new Leaf();
ar & leaf;
//DESERIALIZATION:
Base* b = 0;
ar & b; // would work only if Leaf has been saved in the archive as true_type
对于多团队项目中的工具,它非常强大:测试数据已经由团队序列化,另一个团队可以对接口类IImage反序列化(比如图像),而不会询问:true_tyep是什么:Image3D,AImage2D,Image2DRGB,Image2DRAW等。