c++ - 升级 Boost Serialization 与二进制归档 armv7 到 arm64 的兼容性

标签 c++ serialization boost boost-serialization arm64

我工作的公司在 iOS 和 Android 上发布,现在 Apple 要求我们更新所有应用程序以在 arm64 架构上运行(以前我们只发布 armv7)。不幸的是,我们一直在使用 boost::archive::binary_iarchive(和 binary_oarchive)来存储大量用户数据(保存的游戏、偏好等)。

在测试时,加载这些由 armv7 二进制文件保存的文件,现在在运行我们游戏的“通用二进制”版本的 arm64 设备上会严重失败。

template<typename T>
static T Deserialize(std::vector<char> buffer) {
    boost::iostreams::basic_array_source<char> source(&buffer[0], buffer.size());
    boost::iostreams::stream<boost::iostreams::basic_array_source<char>> input_stream(source);
    boost::archive::binary_iarchive ia(input_stream); // crashes here
    T value;
    ia >> BOOST_SERIALIZATION_NVP(value);
    return value;
}

我们传入的缓冲区大小合理。基于它在 boost::archive::binary_iarchive 的构造函数期间崩溃的事实,我猜测它无法正确读取 header 。

这是记录的错误:

(2005,0x19a1c0310) malloc: *** mach_vm_map(size=7598247065923108864) failed (error code=3)
*** error: can't allocate region

有什么方法可以升级保留用户保存的数据?

最佳答案

如果您需要保留用户的数据,您将不得不通过逆向工程摆脱困境。您可以通过将旧数据发送到服务器进行转换来作弊。

对于可移植文件,您可以尝试 OES Portable Archive实现。

它应该是标准二进制文件的直接替代品,旨在实现真正的可移植性。当然,结果不会与旧格式二进制兼容,所以它只是一个向前发展的解决方案。

关于c++ - 升级 Boost Serialization 与二进制归档 armv7 到 arm64 的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608491/

相关文章:

c++ - 在 C++ 语言版本和标准库依赖项方面 boost 要求

c++ - 将 qi::lexeme 添加到 spirit qi 中的规则时编译失败

c++ - 如何解析像 std::allocator_traits 这样的可选嵌套类型?

c++ clock_gettime()溢出了吗?

用于 cucumber 测试的Java序列化

Centos7需要Boost-Libboost(ContexBroker)

c++ - 具有特定数据类型(如字符串)的多个模板的模板函数?

c++ - CreateSnapshot()是否不会生成Hyper-V虚拟机快照?

java - 无法序列化 HashMap

c# - 对象无法反序列化,因为 'Collection was of a fixed size.'