Как сериализировать общие/слабые указатели?

У меня есть сложная сеть объектов, соединенных с QSharedPointers и QWeakPointers. Есть ли простой способ сохранить/загрузить их с Повышением. Сериализация? До сих пор у меня есть это:

namespace boost {
    namespace serialization {
        template<class Archive, class T>
        void save(Archive& ar, QSharedPointer<T> const& ptr, unsigned version) {
            T* sharedPointer = ptr.data();
            ar & BOOST_SERIALIZATION_NVP(sharedPointer);
        }

        template<class Archive, class T>
        void load(Archive& ar, QSharedPointer<T>& ptr, unsigned version) {
            T* sharedPointer = 0;
            ar & BOOST_SERIALIZATION_NVP(sharedPointer);
            ptr = QSharedPointer<T>(sharedPointer);
        }

        template<class Archive, class T>
        void save(Archive& ar, QWeakPointer<T> const& ptr, unsigned version) {
            T* weakPointer = ptr.toStrongRef().data();
            ar & BOOST_SERIALIZATION_NVP(weakPointer);
        }

        template<class Archive, class T>
        void load(Archive& ar, QWeakPointer<T>& ptr, unsigned version) {
            T* weakPointer = 0;
            ar & BOOST_SERIALIZATION_NVP(weakPointer);
            ptr = QSharedPointer<T>(weakPointer);
        }
    }
}

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

С некоторым усилием я могу преобразовать классы для использования boost::shared_ptr и boost::weak_ptr. Это принесет пользу?

6
задан stribika 18 December 2009 в 14:33
поделиться

1 ответ

Вопрос в том, чего вы действительно хотите достичь, сериализуя указатели? Каков ваш ожидаемый результат? Обратите внимание, что указатели указывают на место в памяти - несколько могут указывать на одно и то же место в памяти.

Сериализация адреса не сработает. Вы не можете просто записать точный адрес памяти, потому что нет способа гарантировать, что объекты при следующем запуске смогут занять то же место (это место может быть уже зарезервировано другой программой).

Сериализация заостренного объекта в каждом месте, где есть указатель , не будет работать:

  1. Это было бы намного больше данных, которые нам нужно было бы сериализовать
  2. Если бы у нас были слабые указатели, создающие циклическая зависимость, которую мы не сможем остановить и получить это соединение позже.
  3. Невозможно объединить одни и те же объекты в один при десериализации

Теперь, когда вы думаете об этом, вы можете попробовать официальный ответ boost :: serialization :

5
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: