boost text 序列化版本(15 vs 18)

Posted

技术标签:

【中文标题】boost text 序列化版本(15 vs 18)【英文标题】:boost text serialization version (15 vs 18) 【发布时间】:2020-08-23 09:01:03 【问题描述】:

我有一个只包含std::map<std::string, int> 的自定义类。 我正在尝试使用 boost::serialization 对其进行序列化。

我用数据 "foor":13 创建了一个对象(这是我的自定义对象中的地图)。 Boost 将其序列化为

22 serialization::archive 15 22 serialization::archive 15 0 0 0 0 1 0 0 0 4 foor 13

到目前为止,一切都很好 (?)。

现在,我采用相同的源代码(几乎没有修改),我编译为 wasm 而不是 x86。 同一个对象现在被序列化为

22 serialization::archive 18 0 0 0 0 1 0 0 0 4 foor 13

因此,出于某些原因,在一种情况下,Boost 选择使用存档的 15 版,而在另一种情况下,它选择了 18 版。 (显然,x86 生成的反序列化在 wasm 程序中不起作用)

如何“强制”Boost 使用存档的 15 版?

【问题讨论】:

【参考方案1】:

第一个序列化样本看起来是 全部无效。

其次,让我们检查15 和或18 是 存档版本号:

#include <boost/archive/text_oarchive.hpp>
#include <iostream>
int main() 
    unsigned v;
    
        boost::archive::text_oarchive oa(std::cout);
        v = oa.get_library_version();
    

    std::cout << "# get_library_version() -> " << v << "\n";

打印 (see live)

22 serialization::archive 17
# get_library_version() -> 17

所以,是的,这看起来很准确

由于它们在存档实现中是硬编码的,因此您必须在两边都使用相应的 Boost 库版本。

相关文档sn-p:

get_library_version()

返回一个包含当前版本号的无符号整数 序列化库。每次进库时这个数字都会增加 以这样一种方式进行更改,即序列化可以针对某些类型进行更改。 例如,假设用于集合成员计数的类型是 改变了。加载集合的代码可能以库为条件 版本以确保由以前版本创建的库 库仍然可以读取。

【讨论】:

非常感谢我自己没有找到的get_library_version。在一天结束时,似乎在我的程序的“wasm”构建期间链接时,我指的是其他版本的 Boost,而不是链接 x86 时。我为 x86 和 wasm 干净地重新编译了 boost,然后我适配了我的 CMakeList.txt 文件。解决了。​​ 酷。你有更多关于如何为 WASM 编译的信息吗?我上次尝试它时很难完成非平凡的代码。一个链接显然会做。干杯【参考方案2】:

棘手的一点是为 wasm 和 x86 构建 Boost::serialization

克隆boost,进入克隆目录。

黄蜂

我最终得到了这条线(网络上许多研究的拼凑;我什至不确定每个论点的意义/有用性)

./b2 toolset=emscripten link=static variant=release threading=single --prefix=build_wasm --build-dir=build_wasm runtime-like=static serialization

x86

./bootstrap.sh --prefix=build_x86
./b2

下一个

此时,我们有两个独立的目录build_wasmbuild_x86 可以链接到。

此时,我不记得我是如何获得文件libboost_serialization.bc的。

cmake

在我的CMakeLists.txt 中,关键行是:

set(BoostWasm_DIR "/absolute/path/to/build_wasm")
set(BoostWasm_emm "$BoostWasm_DIR/boost/bin.v2/libs/serialization/build/emscripten-1.39.13/release/link-static/visibility-hidden")

include_directories($BoostWasm_DIR/include)

file(GLOB boost_js "$BoostWasm_emm/libboost_serialization.bc")
target_link_libraries( write_normalized $boost_js )

由于这是一个与工作相关的项目,我没有完整工作示例的链接。

构建

emcmake cmake .
emmake make

【讨论】:

以上是关于boost text 序列化版本(15 vs 18)的主要内容,如果未能解决你的问题,请参考以下文章

Boost安装

boost 1.67编译VS2017版本

尝试将 boost.serialization 包含到我的 VS 项目中时遇到问题

Boost反序列化错误

VS2008下直接安装使用Boost库1 46 1版本

尝试使用 Boost 序列化库时出错