编译我的静态类库时,我遇到了这个问题。
我知道Boost并没有正式支持VS2012,但由于这是我目前的开发环境,我真的可以使用一些建议。
我一直在寻找,但迄今为止没有任何帮助过我。
示例代码:
foo.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
);
答案 0 :(得分:1)
boost::serialization
是可扩展的,可以扩展为适用于任何类型,因此您可以为load/save
实现自己的std::shared_ptr
版本,请查看boost_installation_path/boost/serialization/shared_ptr.hpp
和从中实现自己的load/save
。作为另一种解决方法,您可以使用boost::shared_ptr
代替std::shared_ptr
!!由于您使用的是boost
,因此我认为使用std::shared_ptr
优于boost::shared_ptr
答案 1 :(得分:1)
您正在尝试序列化指针。您想要序列化指针指向的东西。最简单的方法是将foo << ptr;
替换为foo << (*ptr);
。
*ptr
周围的括号不是必需的,许多人会将它们视为笨拙的标志。但如果你发现它们让你更清楚,那就使用它们。