2016-11-20 3 views
0

Учитывая образец структуры:De/сериализовать объект с картой?

struct SomeName 
{ 
    SomeName() 
    { 
    } 

    ~SomeName() 
    { 
    } 

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

Как я могу сериализовать зЬй :: вектор в двоичный файл?

Я попытался:

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; 
} 

Он работает, чтобы создать файл Дат, но при чтении его обратно он всегда терпит неудачу из-за станд :: Карта внутри него.

Я попытался понять сообщение о сбое, которое является нарушением прав доступа, и это заставляет меня думать, что он не понимает, как инициализировать карту, чтобы заполнить ее при чтении файла обратно? Или что-то похожее на это я не понимал этого больше, чем это.

Нарушение правил доступа для чтения 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 станд :: _ Tree, станд :: Распределитель> 0>> :: _ Copy (станд :: _ Tree_nod, станд :: распределитель> 0>> :: _ Node * _Rootnode, станд :: _ Tree_nod, станд :: распределитель> 0>> :: _ Node * _Wherenode) Line 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; 
} 

В резюме, как мне сериализовать/десериализовать эту структуру из/в двоичный файл?

ответ

0

Эта структура не может быть сериализована, просто интерпретируя ее как массив символов, поскольку ее части относятся к динамической памяти. Используйте некоторую библиотеку сериализации (например, активируйте сериализацию или goob protobuf).

В качестве альтернативы, вы можете осуществить сериализации процедуру вручную, но это очень утомительно и чревато ошибками работы:

  1. запись ID в файл
  2. WRITE Name.length() в файл
  3. WRITE Name.data() в файл
  4. записи Todo.length() к файлу
  5. для каждого члена Todo введите свой ключ и значение
+0

очень информативный, я был под впечатлением, что это было возможно, потому что оно работает по назначению без карты. – Guapo

Смежные вопросы