gpt4 book ai didi

c++ - 将数据序列化代码从 C++ linux/mac 移植到 C++ windows

转载 作者:可可西里 更新时间:2023-11-01 11:14:06 25 4
gpt4 key购买 nike

我在 mac 和 linux 上编译并成功运行了一个软件框架。我现在正试图将它移植到 Windows(使用 mingw)。到目前为止,我已经在 windows 下编译和运行了该软件,但它不可避免地存在错误。特别是,我在将在 macos(或 linux)中序列化的数据读取到程序的 Windows 版本(段错误)时遇到了问题。

序列化过程将原始变量(longs、ints、double 等)的值序列化到磁盘。

这是我使用的代码:

#include <iostream>
#include <fstream>

template <class T>
void serializeVariable(T var, std::ofstream &outFile)
{
outFile.write (reinterpret_cast < char *>(&var),sizeof (var));
}

template <class T>
void readSerializedVariable(T &var, std::ifstream &inFile)
{
inFile.read (reinterpret_cast < char *>(&var),sizeof (var));
}

所以为了保存一堆变量的状态,我依次为每个变量调用serializeVariable。然后为了读回数据,按照保存数据的相同顺序调用 readSerializedVariable。例如保存:

::serializeVariable<float>(spreadx,outFile);
::serializeVariable<int>(objectDensity,outFile);
::serializeVariable<int>(popSize,outFile);

阅读:

::readSerializedVariable<float>(spreadx,inFile);
::readSerializedVariable<int>(objectDensity,inFile);
::readSerializedVariable<int>(popSize,inFile);

但在 Windows 中,读取序列化数据失败了。我猜 Windows 序列化数据的方式有点不同。我想知道是否有一种方法可以修改上面的代码,以便可以在任何其他平台上读取保存在任何平台上的数据...有什么想法吗?

干杯,

本。

最佳答案

像这样的二进制序列化应该可以在这些平台上正常工作。您确实必须尊重字节顺序,但那是微不足道的。我认为这三个平台在这方面没有任何冲突。

不过,您确实不能使用松散的类型规范。 intfloatsize_t 大小都可以跨平台更改。

对于整数类型,使用在 cstdint header 中找到的严格大小的类型。 uint32_tint32_t 等。Windows 没有可用的 iirc header ,但您可以改用 boost/cstdint.hpp。

浮点应该工作,因为大多数编译器都遵循相同的 IEEE 规范。

C - Serialization of the floating point numbers (floats, doubles)

二进制序列化确实需要彻底的单元测试。我强烈建议您投入时间。

关于c++ - 将数据序列化代码从 C++ linux/mac 移植到 C++ windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8154465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com