gpt4 book ai didi

c++ - boost 序列化 : pointer conainer to contains various of DERIVED objects

转载 作者:太空宇宙 更新时间:2023-11-04 13:57:47 25 4
gpt4 key购买 nike

我有一个带有序列化方法的类型类节点。有 Node 的派生类:BigNide、SmallNode..(以及更多)。以及它们的派生类——VitalBigNode。他们每个人也有序列化方法,调用他的基础序列化方法。 (通过 serialization::base_object)。到目前为止,序列化对每种节点都非常有效。

这是棘手的部分:有一个 (Node*)s(指向 Node 的指针)的列表容器,其中包含来自各种节点(派生类)的对象。我想序列化这个容器。我拼命尝试了 unique_ptr、shared_ptr、多态、BOOST_CLASS_EXPORT 等的许多组合使用,但都没有成功。

列表“serializer”将列表中的每个对象作为一个纯 Node 对象进行关联。它调用 Node 类的序列化方法。当然,它会抛出一个错误 - 一个丑陋的错误。

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

一定有一个我错过的充分且已知的解决方案!

非常感谢您的帮助!埃拉德。

最佳答案

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

一个。一种方法:在创建归档文件之后但在反序列化归档文件之前,教导归档文件期望哪些派生类:

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

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

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

 BOOST_CLASS_EXPORT(BigNode);
BOOST_CLASS_EXPORT(Node);

将它们放在一起非常重要,因为每个宏都会对某个静态对象求值,而且这些对象的初始化顺序要稳健,这一点很重要;只有当所有宏都在同一个编译单元中时,才能保证这种稳健性。

当然,请始终使用“ar & p”之类的序列化代码,而不是“ar << *p”,其中 p 是指向派生类型对象的 Base 类型指针。

关于c++ - boost 序列化 : pointer conainer to <BASE> contains various of DERIVED objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com