2011-12-02 11 views
3

可能性の重複:
Boost Serialization using polymorphic archivesブーストシリアル化

私は、派生クラスにベースポインタを使用して私のクラスをシリアル化しようとしていますが、それが唯一のシリアライズベースクラス。

私はちょうどhttp://www.boost.org/doc/libs/1_32_0/libs/serialization/doc/special.html#registrationを読みましたが、エクスポートマクロとレジスタ関数の両方が変更されていないようです。

は、以下の、非常に基本的な、クラス階層を考えてみましょう:

#include <iostream> 
#include <fstream> 
#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 

class A 
{ 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> 
    void serialize(Archive& ar, const unsigned int version) 
    { 
    std::cout << "A!\n"; 
    } 
}; 

class B : public A 
{ 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> 
    void serialize(Archive& ar, const unsigned int version) 
    { 
    ar & boost::serialization::base_object<A>(*this); 
    std::cout << "B!\n"; 
    } 
}; 

int main() 
{ 
    std::ofstream of("mybin.bin"); 
    boost::archive::binary_oarchive oa(of); 

    A* b = new B(); 
    oa << b; 

    delete b; 

    return 0; 
} 

出力は次のようになります。

A!

明らかに、私が探しているのはA! B!これを実現する方法はありますか?

編集: [OK]をクリックしてコメントの関連エントリを確認した後、ここでは何が起こっているのですか。

そこには、変更する3つの事でした:それは

  • 多型と考えられているように

    1. クラスAは、派生クラスをエクスポートする必要がある仮想関数を持つ必要があります。 BOOST_CLASS_EXPORT(B)
    2. OA < < Bの代わりにOA < < * B

    それは標準binary_oarchive、ならびにpolymorphic_binary_oarchiveで動作します。

    EDIT2:私はのはb.cpp(.H)とmain.cppに、重複したシンボルでBOOST_CLASS_EXPORT結果を言わせたら:

    重複シンボルブースト::アーカイブ::詳細:: extra_detail: :init_guid ::グラム

  • +0

    serialize関数を 'virtual'にするべきではありませんか? – fefe

    +0

    私の編集を参照してください。多形アーカイバとboost_class_exportでまだ動作しません。 – vdsf

    +1

    @fefe:仮想テンプレート機能はありません。 – vdsf

    答えて

    3

    私はこのboostパッケージに精通していないですが、私はコピーしてOPは、我々は多型を使用していることを実現

    を述べたのと同じ結果を生成したコードを、コンパイル認めなければなりません、私は012を付け加えたを class Aに設定します。また、 oa.register_type<B>();文書に従って mainで添加され、出力になった:

    A! 
    B! 
    

    仕様によれば、クラスはpolymorphic classときのみdeclares or inherits a virtual functionあります。非多型分類の場合、多型多分は機能しないかもしれません。

    EDIT:代わりにB.hB.cppBOOST_CLASS_EXPORT(B);を置くには

    再定義のこの問題を解決するようです。

    EDIT:

    namespace boost { 
        namespace serialization { 
         template<> struct guid_defined<B> : boost::mpl::true_ {}; 
         template<> inline const char * guid<B>(){ return "B"; } 
        } 
    } 
    namespace boost { 
        namespace archive { 
         namespace detail { 
          namespace { // NOTE 
           template<> struct init_guid<B> { 
            static guid_initializer<B> const & g; 
           }; 
           guid_initializer<B> const & init_guid<B>::g = ::boost::serialization::singleton< guid_initializer<B> >::get_mutable_instance().export_guid(); 
          } 
         } 
        } 
    } 
    

    そしてNOTEでマークされた行のために:ブースト1.42の匿名の名前空間を使用している使用、問題はないでしょう

    BOOST_CLASS_EXPORT(B)の展開結果(再フォーマット)をチェックそれが複数のcppファイルに置かれたり、ヘッダファイルに入れられたり(Ubuntuではg ++でテストされています。しかし、ブースト1.48では、namespace extra_detailが使用されます。これは、複数のcppファイル(VS2010のウィンドウでテストされ、ホームページからブーストを使用してテストした場合)に問題を引き起こします。

    +0

    私はそれを修正した。重複シンボルの詳細な調査は、http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/traits.html#exportにあります。前述の2つのマクロを使用すると、重複したシンボルは削除されますが、直列化。調査する。 – vdsf

    関連する問題