【问题标题】:Writing complex C++ objects to file将复杂的 C++ 对象写入文件
【发布时间】:2012-07-28 22:14:07
【问题描述】:

我有一个看起来像这样的 C++ 对象

class myClass
{
    vector<OtherClass*> otherClassVector;
    AnotherClass* anotherClassObj;
    // A few other primitive types and functions
}

将其存储到磁盘并以编程方式读回的最佳方法是什么? 在二进制模式下使用 fstream 读/写会起作用吗?还是应该使用 boost 序列化?为什么? 我不要求存储的文件是人类可读的。

【问题讨论】:

  • fstream 以二进制模式读/写可以工作,只要你不认为你可以一次性写出整个对象。您必须自己编写代码来编写每个单独的子对象以及矢量大小和其他所有内容。这是为了避免这种繁琐且容易出错的工作,您应该考虑使用 boost。

标签: c++ file serialization


【解决方案1】:

使用boost::serialization 比编写自己的序列化程序更简单。如果 OtherClass 是具体类型(不是基本类型) - 通过读/写序列化很简单,对于向量 - 只需保存大小而不是数组(如果您的 myClass 没有非 POD 类型),然后存储指向 anotheClassObj 指针的元素......

【讨论】:

    【解决方案2】:

    只有当这些对象是 POD 类型时,您才能使用 ofstream f("filename", std::ios::binary); 序列化对象。

    其他任何事情都需要手动处理。举个简单的例子,如果对象包含任何指针,则将保存它们的地址,而不是它们指向的数据。

    对于更复杂的类型,您将不得不完全手动序列化它们(编写一个类或函数来保存该类中的所有 POD 数据,并对所有“特殊”数据做一些棘手的事情),或者使用 boost序列化。

    【讨论】:

    • 包含指针与对象是否为 POD 有什么关系?
    • @Grizzly,没什么,这只是需要手动处理的示例。
    • 我意识到这一点,但如果我不知道,我会认为您的答案的表述方式存在相关性
    • @Grizzly,是的,你说得有道理...我稍微改述了一下,谢谢。
    【解决方案3】:

    C++_Middleware Writer 可能很有趣。与其他方法相比,它具有some advantages

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2023-03-06
      • 2015-08-18
      • 2015-05-15
      • 2011-12-06
      • 2021-10-16
      相关资源
      最近更新 更多