即使是this_type,如何强制存档存储true_type?

时间:2012-04-18 16:30:59

标签: c++ serialization boost boost-serialization

本主题涉及提升序列化。

当我序列化多态对象时,只有当存档不等于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等。

0 个答案:

没有答案