【问题标题】:How to save a std::vector of C++ objects in binary format to disk?如何以二进制格式将 C++ 对象的 std::vector 保存到磁盘?
【发布时间】:2018-10-29 01:20:04
【问题描述】:

我有潜在异构对象的基类指针向量(都派生自同一个基类)。我想将此向量以二进制格式保存到磁盘。 C++ 中是否有一个库来以二进制格式存储对象和 stl 容器?

【问题讨论】:

  • 简短的回答是:不,没有。您必须自己编写所有这些代码。
  • 任务取决于 1. 您正在使用哪个 C++ 编译器实现,2. 代码编译使用的 C++ 运行时版本。

标签: c++ serialization


【解决方案1】:

C++ 中是否有一个库来以二进制格式存储对象和 stl 容器?

是的,Boost Serialisation 正是这样做的。目标之一是:

  • STL 容器和其他常用模板的序列化。

我不会尝试重新发明这个轮子 - 在这个领域有很多极端案例和棘手的问题已经为你解决了。

【讨论】:

    【解决方案2】:

    我建议使用 Google 的 protobuf 库,该库专为解决此问题而设计。它是二进制的,所以根本不是人类可读的。 https://developers.google.com/protocol-buffers/

    【讨论】:

      【解决方案3】:

      考虑一下:

      class Base {
      protected:
          unsigned int id_;
      protected:
          Base() {}
          virtual ~Base(){}
      };
      
      class DerivedA : public Base {
      public:
          int someIntA_;
          short someShortA_;
      };
      
      class DerivedB : public Base {
      public:
          int someIntB_;
          double someDoubleB_;
      };
      
      void writeToFile( const std::string& filename, std::vector<Base*>& objs ) {
          // first few elements in objs
          objs[0] = DerivedA;
          objs[1] = DerivedB;
          objs[2] = DerivedB;
          objs[3] = DerivedA;
      
          // how to pack & extract data in binary?
      }
      

      您的向量包含指向Base 的指针,这取决于系统和架构师将确定sizeof() 的指针类型。大多数系统都有 4 个字节的指针类型,但这不能保证。然而,这些指针指向的数据类型是它们的派生类型。在内存中sizeof(DerivedA) 将不同于sizeof(DerivedB)。您必须告知您的C++Compiler 如何在写入文件和读取文件时解析这些数据 - 从文件中提取,这不包括任何可能使用的压缩技术。

      现在,任何可以为您序列化数据的自动生成库;我对任何事情都不熟悉,但我看到其他人给了你一些可能值得研究的建议,否则你可以根据你的数据类型自行读写文件及其结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        • 2012-07-29
        • 1970-01-01
        相关资源
        最近更新 更多