2

我有一个对象,它代表我正在编程的游戏中地面的各个瓷砖。我还有一个包含对象实例的向量。将此列表保存到文件的最佳方法是什么?我可以遍历向量并保存每个 x,y 坐标和对象使用的图像,但这似乎有点粗糙。我可以使用 boost 头文件,但目前在尝试构建和使用 boost 的其余部分时遇到了一些主要问题。有什么建议么?

4

3 回答 3

1

C++ 没有内置的序列化功能,所以无论你做什么都会有点“粗鲁”,一般来说,如果你保存的对象需要很少或现在需要构造(例如 int、floats 等),那么你可以简单地写出整个一口气矢量,像这样:

std::vector <int> data(16, 0);
std::ofstream output("binary.data");
output.write(static_cast<char *>(&(data[0])), data.size()*sizeof(int));

但是,如果您有需要多步构造函数的数据类型(例如 std::string),那么您必须循环遍历每个元素并使用足够的信息将它们单独写出,以便在从磁盘读取时重构对象。

于 2013-03-07T15:24:13.950 回答
1

这对我来说似乎是一个足够好的解决方案。像这样的格式: {x, y, image_filename} 也会使调试更容易一些,因为您可以通过检查来验证您的保存代码或加载代码是否导致问题(如果出现任何问题)。无论如何,我不认为您可以通过使用二进制解决方案来节省太多空间,因为您最有可能需要完整的 image_filename。

你可以看看Boost::Serialization提供了什么。

于 2013-03-07T15:26:25.740 回答
0

我完全赞同 Boost::Serialization。您实际上可以选择是否需要文本或二进制格式。我通常在开发/调试期间写入/读取文本档案,然后切换到二进制格式进行部署。请注意,二进制格式不能在不同架构之间移植,因此如果您关心存档可移植性,请坚持使用文本格式。

如果您的对象发生变化或者您希望序列化派生类,这样做非常容易,您也可以进行归档版本控制。真的没有必要重新实现这个特定的轮子:-)

也许您可以提供更多有关您在安装 Boost 时遇到的问题(版本?操作系统?编译器?)的信息,肯定有人会提供帮助。

于 2013-03-07T15:36:31.360 回答