/ /プリミティブへのポインターを含むクラスをシリアル化するにはどうすればよいですか? -c ++、boost、boost-serialization

プリミティブへのポインタを含むクラスを直列化するにはどうすればよいですか? - c ++、boost、boost-serialization

ブースト機能を使用しようとしていますプリミティブへのポインターをシリアル化する(そうすれば、自分で逆参照したり、深い保存をしたりする必要はない)。しかし、やろうとするとエラーが山になる含有すること save そして load ファイルからクラスの内容を読み書きするメソッド。このプログラムはコンパイルしません:

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

#include <boost/serialization/shared_ptr.hpp>
#include <boost/shared_ptr.hpp>

#include <fstream>

class A
{
public:
boost::shared_ptr<int> sp;
int const * p;

int const& get() {return *p;}

void A::Save(char * const filename);
static A * const Load(char * const filename);

//////////////////////////////////
// Boost Serialization:
//
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar,const unsigned int file_version)
{
ar & p & v;
}
};

// save the world to a file:
void A::Save(char * const filename)
{
// create and open a character archive for output
std::ofstream ofs(filename);

// save data to archive
{
boost::archive::text_oarchive oa(ofs);

// write the pointer to file
oa << this;
}
}

// load world from file
A * const A::Load(char * const filename)
{
A * a;

// create and open an archive for input
std::ifstream ifs(filename);

boost::archive::text_iarchive ia(ifs);

// read class pointer from archive
ia >> a;

return a;
}

int main()
{

}

私は ない ポインターを逆参照するソリューションに興味があります。ブーストでそれを処理してもらいたい(これらのクラスの多くは同じ基礎となるオブジェクトを指しているかもしれない)。

回答:

回答№1は2

http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html

デフォルトでは、データ型は実装レベル クラスのシリアル化特性は追跡されません。追跡したい場合 ポインタを介した共有プリミティブオブジェクト(たとえば、 参照カウント)、クラス/構造体でラップする必要があります 識別可能なタイプ。実装を変更する代替手段 longのレベルは、プログラム全体でシリアル化されたすべてのlongに影響します -おそらく、意図したものではありません。

したがって:

struct Wrapped {
int value;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar,const unsigned int file_version)
{
ar & value;
}
};

boost::shared_ptr<Wrapped> sp;
Wrapped const * p;