Boost Serialization:指向<base />的指针容器包含各种DERIVED对象

时间:2013-12-19 00:13:14

标签: c++ pointers serialization boost polymorphism

我有一个带有serialize方法的类型Node。 有Node的派生类:BigNide,SmallNode ..(以及更多)。和它们的派生类--VitalBigNode。 它们中的每一个也都有序列化方法,它调用了他的基础序列化方法。 (通过序列化:: base_object)。 到目前为止,serialize非常适合各种节点。

这是棘手的部分: 有一个(Node *)s(指向Node的指针)的列表容器,它包含来自各种节点(派生类)的对象。 我想序列化这个容器。我已经尝试过使用unique_ptr,shared_ptr,polymorphic,BOOST_CLASS_EXPORT等许多组合来徒劳无功。

列表'serializer'将列表中的每个对象都与纯Node对象相关联。它调用Node类的serialize方法。当然,它会抛出一个错误 - 一个丑陋的错误。

仍然试图解决这个问题,在Node类的serialize方法中,我试图编写一个代码来识别派生类,并在序列化之前动态地将对象转换为派生的转换。由于Node必须在其派生类之前声明,因此这是非常有问题的。此外,serialize方法的DEFINITION必须在Node声明头中设置。所以我不能只在Node声明中声明Node :: serialize,然后包含派生类,然后定义Node :: serialize方法。

必须有一个我错过的充分而已知的解决方案!

非常感谢您的帮助! ELAD。

1 个答案:

答案 0 :(得分:0)

这是Boost.Serialization的经典(和可解决的)问题。我打赌你可以在SO上找到它多次回答。以下是摘要:

一个。一种方法:在创建之后但在反序列化存档之前,教导存档了解所期望的派生类:

 ar.template register_type<BigNode>();
 ar.template register_type<Node>();

等。 (用于保存这些呼叫是自动完成的)。通常我将这些调用放入某个函数并将其放入一些单独的文件中。

B中。替代方法:创建一个单独的cpp文件并将宏放在那里

 BOOST_CLASS_EXPORT(BigNode);
 BOOST_CLASS_EXPORT(Node);

将它们保持在一起是非常重要的,因为每个宏都会侵入某个静态对象,并且这些对象的初始化顺序非常重要;只有当所有宏都在同一个编译单元中时,才能保证这种鲁棒性。

当然,总是使用像“ar&amp; p”这样的序列化代码而不是“ar&lt;&lt; * p”,其中p是指向派生类型对象的Base类型的指针。