【问题标题】:boost text serialization version (15 vs 18)boost text 序列化版本(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 版?

【问题讨论】:

    标签: c++ serialization boost version


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2017-06-22
      • 2011-04-30
      • 2021-12-14
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多