Boost序列化:从文本反序列化工作正常,但我使用文本或二进制流收到未注册的类错误

问题描述 投票:0回答:1

我正在并行化我们的模拟代码,我需要将一个复杂的类传递给其他级别。我为 150 多个类添加了序列化实现。当我将对象保存到文件并从中反序列化时,我可以重建该对象。但是,我无法使用二进制或文本流来做到这一点。

我有另一个包含很多成员的类,它对于基于文件和流的反序列化效果很好。我当前的代码库在所有正在序列化的类中都有宏

BOOST_CLASS_EXPORT_KEY
BOOST_CLASS_EXPORT_IMPLEMENT

我的代码非常复杂,粘贴到这里有数百个头文件和

.cpp
文件。我正在寻找一般指导来查明问题以及潜在的解决方案。我也不知道如何创建和隔离代码来解决这个问题,因为我试图重建的类有很多成员,而且它们也有很多成员。

c++ serialization boost deserialization mpi
1个回答
0
投票

困扰许多人的最隐藏的陷阱是宏不会执行任何操作,除非在宏调用之前已包含存档标头。

为了避免需要提前知道要支持哪些档案,请考虑多态档案。

这里是文档链接:

https://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/special.html#export

请注意,此功能的实现要求 BOOST_CLASS_EXPORT 宏出现在要实例化代码的任何存档类标头之后并包含其中。因此,使用 BOOST_CLASS_EXPORT 的代码将如下所示:

...

将 BOOST_CLASS_EXPORT 包含在“a.hpp”标头本身中,就像处理其他序列化特征一样,将使得在调用 BOOST_CLASS_EXPORT 之前很难或不可能遵循上述有关包含存档标头的规则。最好通过在标头声明中使用 BOOST_CLASS_EXPORT_KEY 和在类定义文件中使用 BOOST_CLASS_EXPORT_IMPLMENT 来解决此问题。

该系统对于将代码放置在静态或共享库中具有一定的影响。将 BOOST_CLASS_EXPORT 放在库代码中

将不会产生任何效果,除非还包含存档类头。因此,在构建库时,应该包含他预期使用的所有存档类的所有标头。或者,可以仅包含多态档案的标题

© www.soinside.com 2019 - 2024. All rights reserved.