使用地图去序列化对象?

时间:2016-11-20 21:55:48

标签: dictionary serialization vector stl c++98

给出结构样本:

struct SomeName
{
    SomeName()
    {
    }

    ~SomeName()
    {
    }

    unsigned int Id;
    std::string Name;
    std::map<unsigned int, unsigned int> Todo;
}

如何将std :: vector序列化为二进制文件?

我试过了:

bool Save(std::string filename, std::vector<SomeName> &items)
{
    std::ofstream fileWrite;
    fileWrite.open(filename.c_str(), std::ios::out | std::ios::binary);
    if (!fileWrite)
    {
        std::cout << "Failed to open file for writting...\n";
        return false;
    }
    fileWrite.write(reinterpret_cast<const char*>(&items[0]), items.size()*sizeof(SomeName));
    fileWrite.close();
    return true;
}

它可以生成dat文件,但是当它读回来时,它总是会失败,因为它里面有std :: map。

我试图理解这是一个访问冲突的崩溃邮件,它让我相信它不知道如何在读取文件时初始化地图以填充它?或类似的东西,我不理解它。

  

访问冲突读取位置0xfeeeff03。

回到// <<< THIS LINE

_Nodeptr _Copy(_Nodeptr _Rootnode, _Nodeptr _Wherenode)
    {   // copy entire subtree, recursively
    _Nodeptr _Newroot = _Myhead;    // point at nil node

    if (!_Isnil(_Rootnode)) // <<< THIS LINE
        {   // copy a node, then any subtrees
        _Nodeptr _Pnode = _Buynode(_Myhead, _Wherenode, _Myhead,
  

SerializationCpp.exe!std :: _ Tree,std :: allocator&gt;,0&gt; &gt; :: _ Copy(std :: _ Tree_nod,std :: allocator&gt;,0&gt;&gt; :: _ Node * _Rootnode,std :: _ Tree_nod,std :: allocator&gt;,0&gt;&gt; :: _ Node * _Wherenode)第1078行+ 0xc字节C ++

以下是我回读的内容:

bool Load(std::string filename, std::vector<SomeName> &items)
{
    items.clear();
    std::ifstream file;
    file.open(filename.c_str(), std::ios::in | std::ios::binary);
    if (!file)
    {
        std::cout << "Failed to open file for reading...\n";
        return false;
    }

    SomeName temp;
    while (file.read(reinterpret_cast<char*>(&temp), sizeof temp))
    {
        items.push_back(temp);
    }
    file.close();
    return true;
}

在简历中,如何从/向二进制文件序列化/反序列化该结构?

1 个答案:

答案 0 :(得分:0)

这个结构只能通过将其解释为char数组来序列化,因为它的一部分是指动态内存。使用一些序列化库(例如boost序列化或google protobuf)。

或者,您可以手动实现序列化例程,但这非常繁琐且容易出错:

  1. ID写入文件
  2. Name.length()写入文件
  3. Name.data()写入文件
  4. Todo.length()写入文件
  5. Todo的每个成员写下其键和值