2011-10-24 10 views
2

私のプロジェクトでboost::serializationを使用しています。プロジェクトは大きく、複数の場所でオブジェクトをシリアライズします。 documentation hereによると、私は2つの別々のステップで私のクラスをエクスポートする必要があります。 .hファイル内ファイル間でブーストシリアル化多型レジスタ(エクスポート)が動作しない

  1. BOOST_EXPORT_KEY()、魔女は宣言が含まれています。
  2. BOOST_EXPOET_IMPLEMENT().cppファイルには、エクスポートのインスタンス化(定義)が含まれています。

hier.hクラス階層には3つのクラスがあります。

/* 
B <---+--- D1 
     | 
     +--- D2 
*/ 

#include <boost/serialization/base_object.hpp>                                         

class B {                                                  
public:                                                   
    virtual ~B() {}                                                
    template < typename Ar >                                             
    void serialize(Ar& ar, const int) {                                           
    }                                                   
} ;                                                    

class D1 : public B {                                               
public:                                                   
    virtual ~D1() {}                                               
    template < typename Ar > void serialize(Ar& ar, const int) {                                    
     boost::serialization::base_object<B>(*this);                                       
    }                                                   
} ;                                                    

class D2 : public B {                                               
public:                                                   
    template < typename Ar > void serialize(Ar& ar, const int) {                                    
     boost::serialization::base_object<B>(*this);                                       
    }                                                   
    virtual ~D2() {}                                               
} ;                                                    

#include <boost/serialization/export.hpp>                                          

BOOST_CLASS_EXPORT_KEY(B);                                              
BOOST_CLASS_EXPORT_KEY(D1);                                              
BOOST_CLASS_EXPORT_KEY(D2); 

そしてhier.cpp実装が含まれています

#include <boost/serialization/export.hpp> 
#include "hier.h" 

BOOST_CLASS_EXPORT_IMPLEMENT(D1); 
BOOST_CLASS_EXPORT_IMPLEMENT(D2); 

そしてmain.cppシリアライズ使用:それは問題なくコンパイルされ、それが原因となります実行

#include <iostream>                                                
#include <sstream>                                                
#include <boost/archive/text_iarchive.hpp>                                          
#include <boost/archive/text_oarchive.hpp>                                          
#include <boost/serialization/export.hpp>                                          
#include "hier.h"                                                

int main(int argc, char* argv[])                                            
{                                                    
    B* d1 = new D1();                                               
    B* d2 = new D2();                                               
    std::ostringstream os;                                              
    boost::archive::text_oarchive oa (os);                                          
    oa & d1 & d2;                                                
} 

を:

terminate called after throwing an instance of 'boost::archive::archive_exception' 
    what(): unregistered class - derived class not registered or exported 

派生クラスが登録されていないということは、hier.cppの登録が機能していないことを意味します。私は実装がmain.cpphier.cppの両方で登録した場合のリンクながら、それは二重定義を発行

  1. :ので、しかし、それは、本当に不思議です。 hier.cppの登録はOKであり、リンカーの可視性にさらされていることを意味します。、それ以外の場合、重複した定義エラーはありません。

  2. 実装をmain.cppに登録すると、正常に実行されます。

私はそのような状況に本当に混乱しています。どんなコメントや提案も感謝しています。前もって感謝します。

答えて

7

BOOST_CLASS_EXPORT_*に電話する前に、使用するアーカイブを含める必要があります。次に、makroはヘッダーに特定のシリアライズ関数を追加します。

これは、あなたが以下にhier.cppでコードを変更する必要があります意味:

#include <boost/serialization/export.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 

BOOST_CLASS_EXPORT_KEY(B); 
BOOST_CLASS_EXPORT_KEY(D1); 
BOOST_CLASS_EXPORT_KEY(D2); 

出典:
Boost Serializsation Documentation

PS:
応じhier.h変化で

#include <boost/serialization/export.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 
#include "hier.h" 

BOOST_CLASS_EXPORT_IMPLEMENT(D1); 
BOOST_CLASS_EXPORT_IMPLEMENT(D2); 

コード これがわかりませんあなたの問題を解決していますが、それは問題を引き起こす可能性があると思います。私はその価値があると思う。

+0

これまでに私が見つけたBoostのシリアライズについては、これまでのところ最も分かりやすく、最も有用な質問と回答です。 Boostの他のドキュメントの多くのように、シリアライゼーションドキュメントは情報の放浪であり、この単純な例は非常に簡潔で、私の問題を解決するのに役立ちました。よくやった! –

関連する問題