0

静的クラス ライブラリをコンパイルしているときに、この問題に悩まされています。

Boost が VS2012 を正式にサポートしていないことは知っていますが、これが私の現在の開発環境であるため、実際にアドバイスを得ることができます。

私は周りを探し回っていますが、これまでのところ何も役に立ちませんでした。

サンプルコード:

フー.h:

#include "FooImpl.h"
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>

class Foo
{
public:
    Foo(void) : pImpl(std::make_shared<FooImpl>()) {}
    //similar constructors follow

    //a few get methods here
private:
    std::shared_ptr<FooImpl> pImpl;

    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive & ar, const unsigned int file_version);
}

Foo.cpp:

#include "stdafx.h"
#include "Foo.h"

template<class Archive>
void Foo::serialize(Archive& ar, const unsigned int ver) 
{  
    ar & pImpl;
}

template void Foo::serialize<boost::archive::text_iarchive>(
    boost::archive::text_iarchive & ar, 
    const unsigned int file_version
);
template void Foo::serialize<boost::archive::text_oarchive>(
    boost::archive::text_oarchive & ar, 
    const unsigned int file_version
);

FooImpl.h:

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

class FooImpl
{
public:
    FooImpl(void);
    //other constructors, get methods

private:
    //data members - unsigned int & std::wstring

    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive& ar, const unsigned int ver);
};

FooImpl.cpp:

#include "stdafx.h"
#include "FooImpl.h"

//function implementations

template <typename Archive>
void FooImpl::serialize(Archive& ar, const unsigned int ver)
{
    ar & id_;
    ar & code_;
}

//Later added, serialization requires these

template void FooImpl::serialize<boost::archive::text_iarchive>(
    boost::archive::text_iarchive & ar, 
    const unsigned int file_version
);

template void FooImpl::serialize<boost::archive::text_oarchive>(
    boost::archive::text_oarchive & ar, 
    const unsigned int file_version
);
4

2 に答える 2

1

boost::serializationは拡張可能で、任意の型で動作するように拡張できるため、独自のバージョンのload/savefor を実装し、そこから独自のバージョンをstd::shared_ptr見てboost_installation_path/boost/serialization/shared_ptr.hpp実装できますload/save。別の回避策として、 !!boost::shared_ptrの代わりに使用できます。std::shared_ptrあなたが使用しているので、使用するboost利点はありませんstd::shared_ptrboost::shared_ptr

于 2012-10-11T09:09:57.830 に答える
1

ポインタをシリアライズしようとしています。ポインターが指すものをシリアル化したい。最も簡単な方法は、 に置き換えることfoo << ptr;ですfoo << (*ptr);

かっこを囲む*ptr必要はなく、多くの人はそれらを不器用さの兆候と見なします。しかし、それらがあなたにとって物事をより明確にすることがわかった場合は、それらを使用してください.

于 2012-10-11T11:45:32.457 に答える