私のプロジェクトでboost::serialization
を使用しています。プロジェクトは大きく、複数の場所でオブジェクトをシリアライズします。 documentation hereによると、私は2つの別々のステップで私のクラスをエクスポートする必要があります。 .h
ファイル内ファイル間でブーストシリアル化多型レジスタ(エクスポート)が動作しない
BOOST_EXPORT_KEY()
、魔女は宣言が含まれています。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.cpp
とhier.cpp
の両方で登録した場合のリンクながら、それは二重定義を発行
:ので、しかし、それは、本当に不思議です。
hier.cpp
の登録はOKであり、リンカーの可視性にさらされていることを意味します。、それ以外の場合、重複した定義エラーはありません。実装を
main.cpp
に登録すると、正常に実行されます。
私はそのような状況に本当に混乱しています。どんなコメントや提案も感謝しています。前もって感謝します。
これまでに私が見つけたBoostのシリアライズについては、これまでのところ最も分かりやすく、最も有用な質問と回答です。 Boostの他のドキュメントの多くのように、シリアライゼーションドキュメントは情報の放浪であり、この単純な例は非常に簡潔で、私の問題を解決するのに役立ちました。よくやった! –