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



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

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

是的,提升序列化正是这样做的。目标之一是:

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

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

我建议谷歌的protobuf库,它就是为了解决这个问题而设计的。它是二进制的,所以根本不是人类可读的。 https://developers.google.com/protocol-buffers/

考虑一下:

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

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

最新更新