【问题标题】:Save vector of Objects to file C++将对象向量保存到文件 C++
【发布时间】:2013-02-22 20:40:38
【问题描述】:

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

【问题讨论】:

  • 如果您无法安装 Boost lib,您可以查看 Google 的协议缓冲区:code.google.com/p/protobuf
  • 老实说,我更倾向于问“我怎样才能解决这个提升构建错误?”然后使用他们的序列化模块。对象序列化充满了危险,而 boost.serialization 模块相当简单,可以处理所有奇怪的序列化边缘情况。在 Windows 中,我使用了这些 boost 安装程序,它们运行良好,boostpro.com/download
  • @varnie 谢谢!我会调查的

标签: c++ file object vector save


【解决方案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),那么您必须遍历每个元素并单独写出它们并提供足够的信息从磁盘读取时重建对象。

【讨论】:

  • 好的,Varnie 指出谷歌协议缓冲区可能对我有帮助,但如果这些都不起作用,我肯定会这样做!
  • 老实说,提升序列化是一种更好的方法。
【解决方案2】:

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

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

【讨论】:

  • 我还要说这是最好的方法。您可能还想做的是重载 '
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-09-21
    • 2016-08-15
    • 2012-09-04
    • 2013-02-09
    • 1970-01-01
    • 2022-11-17
    • 2016-10-07
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多