К сожалению, ответ заключается в том, что нет простого способа сериализации чего-либо с указателями в нем, потому что макет памяти ваших данных, вероятно, будет отличаться при загрузке. Сериализатор, способный обрабатывать указатели должен быть очень умным и придумать «макет памяти» для сохранения на диск, который имел бы действительные адреса указателя в нем для сохраненной структуры и который затем переписывал их, поскольку структура была десериализована, чтобы получить указатели, указывающие на правильные места после загрузки завершены.
Действительно забавная часть состоит в том, что если вы разрешаете указатели в сериализуемых структурах, вы должны иметь возможность справляться с циклическими ссылочными графами. Кроме того, shared_ptr
хранит внутренние подсчеты ссылок и учетную информацию, чтобы знать, когда нужно уничтожить объект, поэтому сериализатор должен знать все о том, как это работает, чтобы правильно записывать подсчет ссылок (и игнорировать ссылки от shared_ptr
объектов, которые не находятся внутри сериализованного дерева, но указывают на мысли внутри него).
В основном это гигантская головная боль, поэтому библиотеки сериализации по умолчанию не делают этого. Обычно вы нуждаетесь в довольно специфическом пользовательском поведении, если хотите это сделать, поэтому они оставляют это для вас, чтобы реализовать это, чтобы убедиться, что это сделано правильно.
вы имели в виду, чтобы написать 'увеличить :: shared_ptr', а не' станд :: shared_ptr'? – aldo
yes initally Я бы хотел использовать std :: shared_ptr, но с boost :: shared_ptr и правильным #include все в порядке, поэтому я останусь с boost, спасибо за ваш комментарий. – Guillaume07