C ++将对象从内存传输到文件

时间:2015-01-15 14:11:11

标签: c++ file object persistence

有时需要在文件中存储链接对象的集合以供将来使用。在这方面,有两种最明显的方法,这两种方法似乎都不太令人满意。第一种方法是创建指向文件偏移的指针映射,如下所示:

struct A
{
   int data;
   std::list<B*> links;
};

struct B
{
   char data;
   std::list<C*> links;
};

typedef unsigned Offset;
std::map<void*,Offset> ptr2ofs;

这种方法的问题在于它需要额外的映射,可以进行散列以便更快地访问,但总体上会为每个保存的链接引入时间和空间开销。

第二种方法是将偏移字段直接包含在数据结构中:

struct A
{
   int data;
   Offset offset;
   std::list<B*> links;
};

这使得写入操作更快,但保存后偏移字段变为冗余,并且在加载后将产生内存开销。因此,在这种情况下,将需要两组结构,一组用于保存数据,另一组用于加载它:

struct A_write
{
   int data;
   Offset offset;
   std::list<B*> links;
};

struct A_read
{
   int data;
   std::list<B*> links;
};
因此,这两种方法显然都有明显的缺点,也不能被视为参考方法。但有没有办法改善它们?

1 个答案:

答案 0 :(得分:0)

有没有听说过offset pointers?它们存储相对地址而不是绝对地址,因此如果您只是想将一块内存插入文件并在另一天将其读回内存,则所有地址引用仍然有效。

如果您想使用序列化库,请查看以下内容之一。是的,你可以自己设计它,但是有人已经经历过这个麻烦......