我有潜在异构对象的基类指针的向量(所有对象均源自同一基类)。我想将此向量以二进制格式保存到磁盘。是否有C ++库以二进制格式存储对象和stl容器?
答案 0 :(得分:2)
是否有C ++库以二进制格式存储对象和stl容器?
是的,Boost Serialisation正是这样做的。目标之一是:
我不会尝试重新发明这个轮子-在这个领域中,已经有很多死角案例和棘手的问题已经为您解决。
答案 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
告知如何在写入文件和读取文件(从文件中提取)时解析此数据,并且其中不包括任何可能使用的压缩技术。
现在,将自动为您序列化数据的所有自动生成库都可以使用;我对任何事情都不了解,但是我已经看到其他人给了您一些可能值得研究的建议,否则您将自己根据数据类型来回写入文件及其结构。