升级 Boost Serialization 与二进制归档 armv7 到 arm64 的兼容性
Upgrade Compatibility of Boost Serialization with binary archives armv7 to arm64
我工作的公司在 iOS 和 Android 上发布,现在 Apple 要求我们将我们所有的应用程序更新到 运行 在 arm64 架构上(之前我们只发布对于 armv7)。不幸的是,我们一直在使用 boost::archive::binary_iarchive
(和 binary_oarchive
)来存储大量用户数据(保存的游戏、偏好等)。
在测试时,加载这些由 armv7 二进制文件保存的档案,现在在 arm64 设备上会严重失败 运行我们游戏的 "Universal Binary" 版本。
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 实施。
它应该是标准二进制档案的直接替代品,旨在实现真正的可移植性。当然,结果不会与旧格式二进制兼容,所以它只是一个向前发展的解决方案。
我工作的公司在 iOS 和 Android 上发布,现在 Apple 要求我们将我们所有的应用程序更新到 运行 在 arm64 架构上(之前我们只发布对于 armv7)。不幸的是,我们一直在使用 boost::archive::binary_iarchive
(和 binary_oarchive
)来存储大量用户数据(保存的游戏、偏好等)。
在测试时,加载这些由 armv7 二进制文件保存的档案,现在在 arm64 设备上会严重失败 运行我们游戏的 "Universal Binary" 版本。
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 实施。
它应该是标准二进制档案的直接替代品,旨在实现真正的可移植性。当然,结果不会与旧格式二进制兼容,所以它只是一个向前发展的解决方案。