我有一个带有指向基类对象的向量,因此我可以管理从该类派生的对象。
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@
答案 0 :(得分:1)
你的代码可以工作。您无法序列化多态对象
那样。对于初学者,您正在编写隐藏的vptr
到磁盘;当您重读数据时,它将无效。和
你只是写出基类(Product
)中的数据,
因为这是sizeof(Product)
评估的内容。和
最后,只写一个除char[]
以外的任何字节图像
可能意味着您将无法重读数据
未来的某个时间(在编译器升级或机器之后)
升级,或其他)。
您需要做的是为其定义格式(二进制或文本)
该文件,写下来。对于基本类型,您可以开始
有现成的东西,比如XDR或协议缓冲区,但是
这些都不适用于多态类型。对于
多态类型,你必须从定义你的方式开始
在重读时识别有问题的类型。这可以
棘手:std::type_info
中的任何内容都没有帮助,所以你
需要一些方法来建立你的关系
(派生)类型和标识符。然后每个派生类
必须实现write
函数,该函数首先写入其类型,
然后逐个一个地写出它的数据。在阅读时,你
读取类型,查找相应的读取函数
键入地图,然后调用该函数,然后读取数据
一个接一个。
最后,我可能会指出所有成功的序列化 我见过的方案取决于生成的代码。你形容你的 单独文件中的类型,或特殊标记中的类型 在C ++中标记注释,并有一个程序,读取, 并生成必要的代码(通常是实际的类 你用)。
答案 1 :(得分:0)
这不是你如何“序列化”数据。像这样,指针只在运行时或者删除它们之前有效(取决于先发生/停止的情况)。像这样你将无法恢复你的数据,因为在程序停止后,你以前的内存中的所有内容都变得无效。您必须存储班级中的实际值。