2010-12-13 13 views
9

私は読んで、相互参照し、最終的に一貫した例と答えを見つけられませんでした。私がやろうとしていることはかなり単純ですが、私は明らかに何かが欠けています。私は、このベクターを含む別のオブジェクトをシリアル化したいブーストシリアライゼーション例外:登録されていないクラス、多型ベースの問題のシリアル化

std::vector<AA*> 

:英語で、私は、私のように管理する2つの抽象塩基(ピュアBBは、純粋なAAから派生)、とクラス構造を持っています。以外のすべては、このベクトルは罰金シリアライズし、それはベクトルになったら、それはスロー:

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

iは明示ベースの抽象を宣言、明示的にシリアライズする前に、親タイプを登録するなど、いくつかのことを、試してみましたクラス 'BOOST_SERIALIZATION_ASSUME_ABSTRACT'などと一緒に、しかし、私は実行時に例外が残っている。

私はこの例(と解決策)を記録に残しておきたいので、他の人はこの優秀な、少し不透明なライブラリを使うことができます。一度この例が正方形になると、私はブースト逐次化のメン​​テナーにそれを提出し、FAQやドキュメントに収まるようにします。

/* 
    g++ -Iinclude/ -Llib -lboost_serialization ~/Desktop/ser_ex.cpp -o stest 
*/ 
#include <boost/serialization/serialization.hpp> 
#include <boost/serialization/nvp.hpp> 
#include <boost/archive/xml_oarchive.hpp> 
#include <boost/serialization/vector.hpp> 

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

namespace bser = boost::serialization; 
class AA 
{ 
public: 
    virtual void foo() = 0; 
    std::string name; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar & bser::make_nvp("Name", name); 
    } 
}; 
BOOST_SERIALIZATION_ASSUME_ABSTRACT(AA); 

class BB : public AA 
{ 
public: 
    virtual void foo() = 0; 
    virtual void bar() = 0; 
    int thing; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar.template register_type<AA>(); 
     ar & bser::base_object<AA>(*this); 
     ar & bser::make_nvp("Thing", thing); 
    } 
}; 
BOOST_SERIALIZATION_ASSUME_ABSTRACT(BB); 

class CC : public BB 
{ 
public: 
    virtual void foo() {} 
    virtual void bar() {} 
    int otherThing; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar.template register_type<BB>(); 
     ar & bser::base_object<BB>(*this); 
     ar & bser::make_nvp("OtherThing", otherThing); 
    } 
}; 

int main (int argc, char const *argv[]) 
{ 
    const std::string filename("my.serialized"); 
    const std::string key("AAVector"); 

    std::vector< AA* > vv; 
    vv.push_back(new CC); 

    std::ofstream outfilestream(filename.c_str(), std::ios::binary); 
    boost::archive::xml_oarchive out_archive(outfilestream); 
    out_archive << boost::serialization::make_nvp(key.c_str(), vv); 
    outfilestream.close(); 
} 

答えて

6

私は、これはわずかな修正で動作するようになった:

ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(AA); 
  • 置き換えます

    • BB::serializear & bser::base_object<AA>(*this);を交換

      次のサンプルコードでは、問題を再現するにはar & bser::base_object<BB>(*this);CC::serialize

      ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BB); 
      
    • BOOST_CLASS_EXPORT(CC)CC後の定義を追加します。説明はthis documentation sectionを参照してください。

  • 関連する問題