2011-02-08 8 views
2

boost :: serializationライブラリでは参照を持ち、デフォルトのコンストラクタを持たないオブジェクトを逆直列化できますか?デフォルト以外の構成可能オブジェクトについては参照を持ち、デフォルトのコンストラクタ(boost :: serialization)を持たないオブジェクトを逆直列化します。

class Example 
{ 
    int& value; 

public: 

    Example(int _value): value(_value) {} 
    virtual ~Example() {} 

    friend class boost::serialization::access; 
    template<typename Archive> 
    void serialize(Archive & ar, const unsigned int file_version) 
    { 
     ar & value; 
    } 
}; 

class Usage 
{ 
    Example* example; 

public: 

    Usage(): example(new Example(123)) {} 
    ~Usage() { delete example; } 

    friend class boost::serialization::access; 
    template<typename Archive> 
    void serialize(Archive & ar, const unsigned int file_version) 
    { 
     ar & example; 
    } 
}; 

...

// serialize and deserialize object with reference and no default constructor 
{ 
    Usage source; 

    std::ostringstream oss; 
    boost::archive::text_oarchive oa(oss); 
    oa & source; 

    Usage target; 

    std::istringstream iss(oss.str()); 
    boost::archive::text_iarchive ia(iss); 
    ia & target; // does not compile 
} 

答えて

5

、私は項目に 非デフォルトコンストラクタ hereを見てお勧めします。
クラスは 独自の関数テンプレートload_construct_datasave_construct_dataを使ってシリアル化できます。

+1

これらの機能には非常に厄介な非対称性がありますが、つまり、 'load_construct_data'と' save_construct_data'を使うと、アーカイブの中にいくつかのデータを入れたり/取得したりすると、それらの関数は両方とも 'serialize()'を呼び出します。アーカイブ。しかし、オブジェクト(ポインタではない)を直列化しようとすると 'serialize()'しか使われず、 'save/load_construct_data'を呼び出さないため、すべてのデータを入れたり取得したりしません。私が何を意味するか見ていますか? –

+0

@DavidDoria: 'serialize'は' load_construct_data'の内部で呼び出されるのでしょうか? 正しく理解すると、 'load_construct_data'の後に' serialize'が呼び出されます が終了しました。 'load_construct_data'はクラス (答えにリンクされている文書の中の' m_attribute')、 を構築するのに必要なデータだけを読み込んで、 'serialize'をロードします(文書中の' m_state')。 –

+1

はい、そうです。問題は、シリアル化がポインタ型でのみ機能することです。つまり、私たちがテストテストをしたら、 outArchive <<テストでは、save_construct_dataではなくserialize()のみが呼び出されます。次に、逆シリアル化(Test * readTest; inArchive >> readTest;)するためにポインタ型を使用する必要があるため、動作しません。 –

関連する問題