2012-03-30 2 views
9

У меня есть объект, который следующее поле:импульс сериализации и станд :: shared_ptr

boost::unordered_map<std::string, std::shared_ptr<Foo> > m_liste_; 

Я хотел бы сериализации, но это кажется StD :: shared_ptr не может быть сериализовать простым способом

У кого-нибудь есть решение?

+0

вы имели в виду, чтобы написать 'увеличить :: shared_ptr', а не' станд :: shared_ptr'? – aldo

+0

yes initally Я бы хотел использовать std :: shared_ptr, но с boost :: shared_ptr и правильным #include все в порядке, поэтому я останусь с boost, спасибо за ваш комментарий. – Guillaume07

ответ

11

Я подозреваю, что вам не хватает включаемый,

#include <boost/serialization/shared_ptr.hpp> 

link, at the bottom

Кроме того, пример делает его похожим на сглаживание и циклы позаботятся по умолчанию.

_Of Конечно, наличие циклов приведет к возможной утечки памяти с shared_ptr, которые не имеют ничего общего с сериализации, и вы все равно придется прислушаться к тем (избегая циклов или рационального использования weak_ptr) _

Посмотреть также:

+0

действительно хорошая интуиция – Guillaume07

-5

К сожалению, ответ заключается в том, что нет простого способа сериализации чего-либо с указателями в нем, потому что макет памяти ваших данных, вероятно, будет отличаться при загрузке. Сериализатор, способный обрабатывать указатели должен быть очень умным и придумать «макет памяти» для сохранения на диск, который имел бы действительные адреса указателя в нем для сохраненной структуры и который затем переписывал их, поскольку структура была десериализована, чтобы получить указатели, указывающие на правильные места после загрузки завершены.

Действительно забавная часть состоит в том, что если вы разрешаете указатели в сериализуемых структурах, вы должны иметь возможность справляться с циклическими ссылочными графами. Кроме того, shared_ptr хранит внутренние подсчеты ссылок и учетную информацию, чтобы знать, когда нужно уничтожить объект, поэтому сериализатор должен знать все о том, как это работает, чтобы правильно записывать подсчет ссылок (и игнорировать ссылки от shared_ptr объектов, которые не находятся внутри сериализованного дерева, но указывают на мысли внутри него).

В основном это гигантская головная боль, поэтому библиотеки сериализации по умолчанию не делают этого. Обычно вы нуждаетесь в довольно специфическом пользовательском поведении, если хотите это сделать, поэтому они оставляют это для вас, чтобы реализовать это, чтобы убедиться, что это сделано правильно.

+1

Теперь вы предлагаете, чтобы Boost Serialization не справлялся со сложностями, которые вы упомянули? Я вполне уверен, что это возможно. См. Учебную демонстрацию: http://www.boost.org/doc/libs/1_49_0/libs/serialization/example/demo.cpp – sehe

+0

Ничто в этом примере не сериализует что-либо с указателями в нем, кроме контейнеров STL (которые, конечно, используют они internall), которые он явно отмечает, уже имеют определенную поддержку в библиотеке сериализации. Тем не менее, этот пример показывает, как обеспечить поведение сериализации для ваших собственных типов, что является крюком, который вы используете для сериализации всего, что библиотека не может обрабатывать со своими знаниями по умолчанию. –

+0

'std :: list > ​​schedule;' и 'typedef bus_stop * bus_stop_pointer; std :: list останавливается; '- и ** да ** шины останавливаются между маршрутами. Интересно, какая ссылка _you_ нажала? – sehe

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