Как сериализовать необработанное указатель с пользовательским поведением, используя библиотеки Boost :: Serialization илC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как сериализовать необработанное указатель с пользовательским поведением, используя библиотеки Boost :: Serialization ил

Сообщение Anonymous »

Я хотел бы использовать одну из этих библиотек сериализации для архивирования контейнера STL, который удерживает необработанные указатели на объект. Тем не менее, я не хочу (или нуждается) хранить указатели, а также объекты, на которые они указывают. Упомянутые объекты будут иметь свою собственную реализацию сохранения/нагрузки, которая гарантирует, что они будут перезагружены в том же порядке вместе с вектором, который можно проиндексировать для получения нового адреса после перезагрузки.
Таким образом, я Нужен метод для выполнения следующего перевода при архивировании контейнеров, удерживающих эти указатели: < /p>

В магазине архивируйте только индекс (уже является переменной класса) < /li >
При загрузке используйте индекс, чтобы найти новый адрес и восстановить его в контейнере < /li>
< /ul>
Этот пример должен помочь проиллюстрировать : < /p>
typedef struct MyStruct* MyPtr;

struct MyStruct {
// many instances of this struct will already exist when I restore MyMap below
// this index is guaranteed to uniquely identify an identical instance run-to-run
// even though the address will be different
// I want to save this index in place of MyPtr in the archived MyMap on archive save
int index {0};
// more data ...
}

// this index can then be used to lookup the address of it's MyStruct instance
// on archive load
std::vector pool;

// this STL container is what actually needs to be archived, but (as stated above)
// instead of saving MyPtr, I want to save the integer index
// then on load, use that to lookup the new address and restore that to the container
typedef std::unordered_map MyMap;
MyMap myMap;

void doWork() {
// read MyMap from archive: ar >> myMap;
// work with MyMap
// save MyMap to archive: myMap >> ar;
}
< /code>
Кажется, это должно быть возможно из того, что я могу сделать из документации, но я не успешно выполнил эту работу. < /p>
Я изначально пытался реализовать Это с использованием Boost :: serialization. Легко просто сохранить индекс, но при загрузке поведение библиотеки по умолчанию состоит в том, чтобы создать новый экземпляр объекта, указанного, а затем восстановить индекс к этому. Я попытался переопределить это, используя признаки сериализации класса, а именно уровни реализации и/или отслеживания, без успеха. пришел к (возможно, неправильному) выводу, что попытка сделать то, что я хочу, не будет возможна из метода MyStruct :: serialize (). Я думал, что смогу использовать помощника для поиска индекса, но к тому времени, когда метод serialize () вызывается, кажется, что слишком поздно делать что -либо с отслеживанием, которое приводит к созданию объекта при нагрузке.
Когда я изначально нашел библиотеку зерновых в качестве возможной альтернативы, я надеялся, поскольку она просто не беспокоилась ни о чем. Тем не менее, теперь я застрял со статичкой_ассертом, говоря, что необработанные указатели не поддерживаются, и вместо этого использую умный указатель (что не является вариантом для меня.) < /P>
Я надеялся, что предоставление Пользовательская обработка типа для MyPTR может обеспечить поведение, которое мне нужно, но теперь кажется, что мне, возможно, придется специализировать предоставленную сериализацию контейнеров STL и/или архивные шаблоны. Оба из которых выглядит сложным. Пропустил что -то очевидное? Можно ли предоставить простой метод обработки указателей mystructs, или я застрял, пытаясь специализировать все необходимые мне контейнеры STL? Или, может быть, это то, чего я не вижу, что может сделать это в специализации архива?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/794 ... -boostseri
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»