如何将二进制格式的C ++对象的std :: vector保存到磁盘?

时间:2018-10-29 01:20:05

标签: c++ serialization

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

3 个答案:

答案 0 :(得分:2)

  

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

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

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

我不会尝试重新发明这个轮子-在这个领域中,已经有很多死角案例和棘手的问题已经为您解决。

答案 1 :(得分:0)

我建议使用Google的protobuf库,该库仅用于解决此问题。它是二进制的,因此根本不可读。 https://developers.google.com/protocol-buffers/

答案 2 :(得分:0)

考虑一下:

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告知如何在写入文件和读取文件(从文件中提取)时解析此数据,并且其中不包括任何可能使用的压缩技术。

现在,将自动为您序列化数据的所有自动生成库都可以使用;我对任何事情都不了解,但是我已经看到其他人给了您一些可能值得研究的建议,否则您将自己根据数据类型来回写入文件及其结构。