2

本主题涉及 boost 序列化。

当我序列化一个多态对象时,只有当它不等于 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 41 0 0 0 0 0 0 0 0

它包含叶具体类型信息。

但是,如果我这样做:

Leaf* b = new Leaf();
boost::archive::text_oarchive ar(ios);
ar & b;

然后存档包含:

22 序列化::归档 9 0 1 0 0 0 0 0 0 0 0

它不包含叶子类型信息。

如何生成所有类型为 true_type 的存档

我搜索了 2 种方法: - 调用归档类型(register_type,save_pointer,...)的方法不成功 - 直接更改 boost/archive/detail/oserializer.hpp 文件:在 struct 多态中,在函数模板中 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 等。

4

0 回答 0