【发布时间】:2011-11-16 15:48:57
【问题描述】:
我有一个在 mac 和 linux 上编译并成功运行的软件框架。我现在正在尝试将其移植到 Windows(使用 mingw)。到目前为止,我已经在 Windows 下编译和运行了该软件,但它不可避免地存在错误。特别是,我在将 macos(或 linux)中序列化的数据读取到程序的 windows 版本(segfaults)时遇到问题。
序列化过程将原始变量(long、int、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对数据的序列化有点不同。我想知道是否有一种方法可以修改上述代码,以便可以在任何其他平台上读取保存在任何平台上的数据......有什么想法吗?
干杯,
本。
【问题讨论】:
-
什么是T类型?我可以为不同的编译器考虑不同的 sizeof(var) 值——例如,作为结构元素对齐的结果。想想另一种序列化机制,比如 XML。
-
类型是原始变量(例如,参见编辑后的帖子)..例如,我不知道编译器可以为 sizeof(long) 生成不同的值。你确定吗?我的意思是,我认为 long 总是 4 个字节,char 总是 1 个字节,独立于编译器等。
-
是的,绝对是,我们处理多个平台,在一些平台上 long 是 4 个字节,在一些平台上是 8 个字节。我相信标准只规定了数据类型的最小字节数,而不是确切的字节数。
-
既然如此,混蛋!谢谢!将按照 Alex 的建议研究 XML。刚刚确认这是问题所在:在我的 Mac 上,long 是 8 个字节,在我的 Windows 平台上,它是 4。
-
您可能还想研究 boost 的序列化库或 json(我认为是 libjanson),因为我发现它们的重量更轻。
标签: c++ windows linux g++ mingw