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_wasm
和build_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)的主要内容,如果未能解决你的问题,请参考以下文章