6

QSharedPointers と QWeakPointers に接続されたオブジェクトの複雑なネットワークがあります。Boost.Serialization でそれらを保存/ロードする簡単な方法はありますか? これまでのところ、私はこれを持っています:

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_ptrand boost::weak_ptr. それは役に立ちますか?

4

1 に答える 1

5

問題は、ポインターをシリアル化することによって本当に何を達成したいのかということです。期待される出力は何ですか? ポインタはメモリ内の場所を指すことに注意してください。複数のポインタがメモリ内の同じ場所を指す場合があります。

アドレスのシリアル化は機能しません。次の実行時にオブジェクトが同じスペースを使用できることを保証する方法がないため、正確なメモリアドレスを書き留めることはできません (別のプログラムがその場所を既に予約している可能性があります)。

ポインターがある各場所でポイントされたオブジェクトをシリアル化することはできません。

  1. これは、シリアル化する必要があるより多くのデータになります
  2. 循環依存関係を作成する弱いポインターがある場合、後でその接続を停止して取得することはできません。
  3. 逆シリアル化時に同じオブジェクトを 1 つにマージする方法はありません

考えてみると、次の公式の回答を試すことができますboost::serialization

于 2009-12-18T17:26:56.137 に答える