
То, что мне нужно, архивировать, - это контейнеры STL, которые держат необработанный указатель на эти данные, но вместо адреса указателя я хочу сохранить индекс, связанный с каждым экземпляром MyStruct. Затем при загрузке я хочу использовать индекс для поиска новой новой MyStruct и восстановить этот адрес в контейнер. < /P>
Этот пример должен проиллюстрировать: < /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>
Прежде чем я опишу, что я попробовал, сначала позвольте мне предусматривать, что я мог неверно истолковать документацию или неправильно прочитать код библиотеки. Если вы эксперт в библиотеках Boost :: Serialization или зерновых (которые очень похожи), пожалуйста, не стесняйтесь меня исправить. сериализация и ожидала использовать помощника. К сожалению, я не смог предотвратить обращение с указателями по умолчанию библиотеки посредством отслеживания связанного объекта. Я мог бы сохранить архив только с помощью целочисленного индекса, используя Mystruct :: serialize (), но при нагрузке создается новая Mystruct для восстановления индекса. Я попытался изменить черты сериализации класса, а именно уровни реализации и/или отслеживания, без успеха. Если бы было только несколько из этих структур, и они были маленькими, я мог бы считать взлом, который рассматривает этот нежелательный объект как временный, захватить индекс, а затем уничтожить его, но в итоге накладные расходы убили бы меня.
Затем я посмотрел на использование обертки, но копание в код библиотеки, кажется, слишком поздно в методе класса. Это подразумевает, что его нужно обрабатывать с помощью пользовательского типа или с использованием специализации архива. Я думал, что смогу создать пользовательский тип для MyStruct, но, похоже, мне нужно будет специализировать все контейнеры STL, в которых хранятся эти значения. С различными аналогичными типами mystruct и различными контейнерами, используемыми различными способами, это не идеальное решение. Если я не специализируюсь на всех комбинациях того, как их можно хранить во всех различных контейнерах, любое будущее использование этих типов в другом контейнере потребует нового кода поддержки типа. Не совсем удобная реализация для бедного разработчика, который просто хочет что-то сделать, используя другой контейнер, и не должен тогда понимать реализацию сериализации нижнего уровня в процессе. < /P>
it Был ли в этот момент я обнаружил библиотеку зерновых (по иронии судьбы, через старый пост от автора Boost :: Serialization.) Я был заинтригован, что зерновые вообще не обрабатывают необработанные указатели, поэтому мне не пришлось бы об этом беспокоиться делать что -то нежелательное под капюшоном. Я также получил бы преимущества PERF и более современный код, который активно поддерживается (хотя обе базы кода кажутся довольно стабильными.) Однако теперь я попадаю в зерновые «static_assert» не поддерживает сериализацию необработанных указателей - пожалуйста, используйте умный указатель »( который не вариант). И, поэтому я вернулся туда, где был раньше: необходимость рассматривать специализацию архива. Тем не менее, не ясно, что это предотвратит утверждение, если я не сойдет с рук, не имея метода сериализации класса в MyStruct. Я хочу спросить сообщество (особенно тех из вас, у кого есть опыт более низкого уровня, используя эти библиотеки), если это кажется правильным подходом? Или я что -то пропустил по пути, что не требует, чтобы я копался в код библиотеки, чтобы использовать его? В любом случае, если бы вы могли указать мне на конкретный код (либо в самой библиотеке, либо на репрезентативный пример), это было бы идеально. Я бы предпочел из первых рук рабочих знаний, а не обобщения.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/794 ... -boostseri