версия ускоренной сериализации текста (15 против 18) - PullRequest
1 голос
/ 08 мая 2020

У меня есть собственный класс, содержащий только 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 версию архива?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Первый сериализованный образец выглядит недействительным в целом.

Во-вторых, давайте проверим, что 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";
}

Prints ( увидеть вживую )

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

Итак, да, это выглядит точно

Поскольку они жестко запрограммированы в реализации архива, вам придется использовать соответствующую библиотеку Boost версия с обеих сторон.

Соответствующий do c фрагмент:

get_library_version()

Возвращает целое число без знака, содержащее текущий номер версии библиотеки сериализации. Это число будет увеличиваться каждый раз, когда библиотека изменяется таким образом, чтобы сериализацию можно было изменить для некоторого типа. Например, предположим, что тип, используемый для подсчета членов коллекции, изменен. Код, загружающий коллекции, может зависеть от версии библиотеки, чтобы гарантировать, что библиотеки, созданные предыдущими версиями библиотеки, все еще можно читать.

0 голосов
/ 08 мая 2020

Сложность заключалась в том, чтобы собрать Boost::serialization для wasm и x86.

Clone boost, войти в клонированный каталог.

wasm

Я закончил с этой строкой (лоскутное одеяло многих исследований в Интернете; я даже не уверен в значении / полезности каждого аргумента)

./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
...