DLL内のクラス構造を外部的にシリアライズする(作業中の)例を探しています。現在、私はその事例を見つけることができません。 Boostのドキュメントには、いくつかのマクロが記載されているだけです。フォーラムやニュースグループは、ソリューションに関する特定の問題について議論しています。クラスのシリアライゼーションをDLLに入れよう
私は次のようなクラス構造を(外部的に)直列化する例を求めています。クラスコードに加えて、シリアル化のためのコードをいくつか追加しました(これは動作しません。エラーメッセージの下部を参照してください)。
class Foo
{
public:
Foo() { number_ = 0; }
virtual ~Foo() {}
int getNumber() { return number_; }
void setNumber(int var) { number_ = var; }
private:
int number_;
};
class Bar : public Foo
{
public:
Bar() { doubleNumber_ = 0.0; }
virtual ~Bar() {}
double getDouble() { return doubleNumber_; }
void setDouble(double var) { doubleNumber_ = var; }
private:
double doubleNumber_;
};
私がこれまで持っているものすべてが、このようなコードです:
serializeFoo.hが
#ifndef _SERIALIZE_FOO_H_
#define _SERIALIZE_FOO_H_
#include "Foo.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>
namespace boost {
namespace serialization {
template <typename Archive>
void save(Archive& ar, const Foo& object, const unsigned int version)
{
ar << object.getNumber();
}
template <typename Archive>
void load(Archive& ar, Foo& object, const unsigned int version)
{
int number;
ar >> number;
object.setNumber(number);
}
}} //namespace brackets
BOOST_SERIALIZATION_SPLIT_FREE(Foo)
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(Foo)
#endif //_SERIALIZE_FOO_H_
serializeFoo.cpp
#include "serializeFoo.h"
BOOST_CLASS_EXPORT_IMPLEMENT(Foo)
seriali zeBar.h:
#ifndef _SERIALIZE_BAR_H_
#define _SERIALIZE_BAR_H_
#include "Bar.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>
namespace boost {
namespace serialization {
template <typename Archive>
void save(Archive& ar, const Bar& object, const unsigned int version)
{
ar << base_object<Foo>(object);
ar << object.getDouble();
}
template <typename Archive>
void load(Archive& ar, Bar& object, const unsigned int version)
{
double doubleNumber;
ar >> doubleNumber;
object.setDouble(doubleNumber);
}
}} //namespace brackets
BOOST_SERIALIZATION_SPLIT_FREE(Bar)
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(Bar)
#endif //_SERIALIZE_BAR_H_
serializeBar.cpp:
#include "serializeBar.h"
BOOST_CLASS_EXPORT_IMPLEMENT(Bar)
シリアライズ・コードがDLLに入り、クラスfooとbarを使用して別のプロジェクトで使用する必要があります。すべてがうまくコンパイルされますが、実行時にメッセージが表示されます
unregistered class - derived class not registered or exported
私は間違ったマクロを使用しましたか?マクロが欠けていますか?上記のコードは正しいのですか、または何らかの構造的なエラーがありますか?おそらく、これは他の多くの人にとっても役に立つかもしれませんが、私はDLLへのクラスのシリアライゼーションを非常にエキゾチックなものにしているとは思っていません...
私がBoost-docsで見たものは、 'BOOST_SERIALIZATION_FACTORY_0(Foo)'でしたが、それが必要かどうかわかりません。リンク:http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/special.html#dlls – MOnsDaR
もしあなたが気分が良くなるなら、私はそれがうまく動いているプロジェクトを持っていますヘッダファイルの一番上にアーカイブヘッダーを含めるという点を除いて、コードはあなたのものとかなり同じように見えます。 P.S.それは技術的に '.so'ではなく、' .dll'ではなく、違いを生むべきではありません... – TC1
私は "Shared lib"を最初に書くつもりでしたが、これは現在この特定のタイプの共有ライブラリの問題です。 – MOnsDaR