我有一个对象,它代表我正在编程的游戏中地面的各个瓷砖。我还有一个包含对象实例的向量。将此列表保存到文件的最佳方法是什么?我可以遍历向量并保存每个 x,y 坐标和对象使用的图像,但这似乎有点粗糙。我可以使用 boost 头文件,但目前在尝试构建和使用 boost 的其余部分时遇到了一些主要问题。有什么建议么?
3 回答
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),那么您必须循环遍历每个元素并使用足够的信息将它们单独写出,以便在从磁盘读取时重构对象。
这对我来说似乎是一个足够好的解决方案。像这样的格式: {x, y, image_filename} 也会使调试更容易一些,因为您可以通过检查来验证您的保存代码或加载代码是否导致问题(如果出现任何问题)。无论如何,我不认为您可以通过使用二进制解决方案来节省太多空间,因为您最有可能需要完整的 image_filename。
你可以看看Boost::Serialization提供了什么。
我完全赞同 Boost::Serialization。您实际上可以选择是否需要文本或二进制格式。我通常在开发/调试期间写入/读取文本档案,然后切换到二进制格式进行部署。请注意,二进制格式不能在不同架构之间移植,因此如果您关心存档可移植性,请坚持使用文本格式。
如果您的对象发生变化或者您希望序列化派生类,这样做非常容易,您也可以进行归档版本控制。真的没有必要重新实现这个特定的轮子:-)
也许您可以提供更多有关您在安装 Boost 时遇到的问题(版本?操作系统?编译器?)的信息,肯定有人会提供帮助。