2016-06-10 8 views
0

Структура данных, которую я хотел бы сериализовать, - это в основном список объектов. Объект может иметь указатель на другой. Последовательность завершается с конфликтом указателя. http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/exceptions.html#pointer_conflictРасширение сериализации с помощью указателей

Вот минимальный пример моей структуры данных: (Моя реальная структура является более сложной.)

struct Data 
{ 
    std::vector<Object> objects; 
} 
struct Object 
{ 
    std::string name; 
    Object *other; 
} 

я могу работать вокруг меняется список элементов для указателей std::vector<Object*>, потому что импульс может создать элементы в любом месте, однако, это очень навязчиво. Еще одна идея - убедиться, что все объекты созданы сначала, а затем указатели. Но как я могу это достичь? Любые альтернативы?

ответ

1

вы можете сделать так: 1) определить идентификатор в Object 2) когда делать сериализацию класса, использовать идентификатор для указателя 3) после всех данных производятся, петля всего объекты, чтобы сделать идентификатор фактического указателя

если это просто вектор, то можно игнорировать указатель на Object когда делать последовательный и deserial, потому что вы знаете, что непрерывно связаны между собой, поэтому его легко восстановить связь непрерывно когда де-сериал имеет временный указатель предыдущего объекта, связанного с текущим объектом.

+0

Вы бы вычислили ID с помощью арифметики указателя, например 'other - & objects [0]'? Звучит выполнимо, но требует специальных методов сохранения и загрузки. – SpamBot

+0

Да, когда вы загружаете объект в новое приложение, вы можете построить сопоставление между ID и адресом памяти, а другой объект может использовать идентификатор, который ищет адрес объекта (а затем сам объект), а затем построить сопоставление между ними. Я сделал такое сопоставление в моем проекте, и он работал хорошо. –

0

Я, наконец, работал над моей проблемой pointer_conflict, используя (умные) указатели для всех данных, на которые ссылаются несколько раз.

struct Data 
{ 
    std::vector< std::unique_ptr<Object> > objects; 
} 
struct Object 
{ 
    std::string name; 
    Object *other; 
} 

Поскольку Object всегда может быть создан в произвольном месте, порядок в сериализации не имеет значения. Недостатком является то, что структура данных изменилась. В моей заявке это влечет за собой несколько изменений в методах getter и setter от Data.

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

  • Нет связанных вопросов^_^