使用指向文件的指针保存矢量中的对象

Save objects from vector with pointers to file

本文关键字:对象 保存 指针 文件      更新时间:2023-10-16

我有一个向量,它带有指向基类对象的指针,这样我就可以管理从该类派生的对象。

vector <Product*>  products;

我正在尝试在迭代向量的同时将这些对象写入文件但我不确定这是否正确。

void Inventory ::  saveProductsToFile()
{
ofstream outfile;
outfile.open("inventory.dat",ios::binary);
list <Product*> :: iterator it;
for(it=products.begin(); it!=products.end(); it++)
outfile.write((char*)*(it),sizeof(Product));
}

文件已经创建,但我不知道我是在保存实际对象本身还是它们地址。这是正确的还是有其他方法?

文件如下所示:

ˆFG "   H*c     Âõ(œ@@pFG    h*c b'v      b@

您的代码可以工作。不能在中序列化多态对象那样。对于初学者来说,您正在编写隐藏的vptr到磁盘;当您重新读取数据时,它将无效。和您只写出基类(Product)中的数据,因为这就是sizeof(Product)的评估结果最后,只写一个char[]以外的任何东西的字节映像可能意味着你将无法重新读取数据将来的某个时间(在编译器升级或机器之后升级或其它)。

您要做的是为文件,然后写。对于基本类型,您可以启动有一些现有的东西,比如XDR或协议缓冲区,但是这两种方法都不能很好地处理多态类型。对于多态类型,您必须首先定义重读时要确定有问题的类型。这可以是棘手:std::type_info中没有任何帮助,所以您需要一些方法在(派生的)类型和标识符。然后每个派生类必须实现首先写入其类型的CCD_,然后一个接一个地写出它的数据。阅读时读取类型,查找相应的读取函数键入一个映射,并调用该函数,然后该函数读取数据一个接一个。

最后,我可以指出,所有成功的序列化我看到的方案依赖于生成的代码。你描述了你在单独的文件中,或在特殊标记中(在C++中标记的注释)并且具有读取该注释的程序,并生成必要的代码(通常是实际的类您使用)。

这不是"序列化"数据的方式。像这样,指针只有在运行时或删除它们之前(取决于首先发生/停止的情况)才有效。像这样,你将无法恢复你的数据,因为在程序停止后,你以前记忆中的一切都将无效。您必须存储类中的实际值。