可能性の重複:
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つの事でした:それは
- クラスAは、派生クラスをエクスポートする必要がある仮想関数を持つ必要があります。 BOOST_CLASS_EXPORT(B)
- OA < < Bの代わりにOA < < * B
それは標準binary_oarchive、ならびにpolymorphic_binary_oarchiveで動作します。
EDIT2:私はのはb.cpp(.H)とmain.cppに、重複したシンボルでBOOST_CLASS_EXPORT結果を言わせたら:
重複シンボルブースト::アーカイブ::詳細:: extra_detail: :init_guid ::グラム
serialize関数を 'virtual'にするべきではありませんか? – fefe
私の編集を参照してください。多形アーカイバとboost_class_exportでまだ動作しません。 – vdsf
@fefe:仮想テンプレート機能はありません。 – vdsf